一、 包装类
java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。
包装类顾名思义就是将基本的数据类型以及一些辅助方法包装到类中,例如自己实现一个int的包装类:
class IntDemo {
private int num;
public IntDemo(int num) {
this.num = num;
}
public int intValue() {
return this.num;
}
}
二、Java提供的包装类
8个包装类:
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double
boolean Boolean
出了Boolean都有parse类名,转换成类名的类型方法Integer: int的包装类
构造方法:没有无参构造方法
new Integer(int value);
new Integer(String str);
Integer的自动装箱:实际调用了valueOf()方法
Integer ins = 19;注意Integer的自动包装有缓冲值,-128-127一个字节
自动装箱时,首先会判定当前的值是否在缓冲区中[-128,127],如果再改区间中,直接从缓冲区中获取对应的Integer对象 反之会重新创建一个新的Integer对象Boolean:
字面值创建Boolean对象时 只能指定true和false 并且创建的对象也是对应的true和false
字符串创建Boolean对象是 只要字符是true/false 无所谓大小写 得到对应的Boolean对象就是与之对应的true和false,其它所有字符串赋值都是false
三、拆箱与装箱
装箱:
将基本数据类型封装为包装类对象,利用每一个包装类提供的构造方法实现装箱操作。
拆箱:
将包装类中包装的基本数据类型数据取出。
/ 装箱
Integer integer1 = new Integer(1);
// 拆箱
int integer2 = integer1.intValue();JDK1.5之后提供自动拆装箱。
// 自动装箱
Integer integer1 = 1;
// 自动拆箱
int integer2 = integer1;
四、自动装箱的内存复用
自动装箱时,对于Integer var = ?,如果var指向的对象在-128 至 127 范围内的赋值时,生成的Integer实例化对象是由 IntegerCache.cache() 方法产生,它会复用已有对象。和String的共享池操作是一个道理,cache()方法会将位于-128~127范围内产生的Integer对象入池,下次使用的时候,从池中拿去,就不会在创建了。
所以,在这个数值区间内的 Integer对象的栈指向(属性名) 可以直接使用==进行判断,因为值相同,指向的就是同一片区域。但是这个区间之外的所有数据,自动装箱都会在堆上产生实例化,并不再复用已有对象,这是一个大坑,为了避免这个问题,推荐使用 equals 方法进行Integer的判断。
对于所有数值型的包装类来说,都会涉及到上面这种问题,一定要多加注意。
而对于手动装箱,即采用new进行包装类创建时,不会发生内存复用,因为new关键字每次使用,都会开辟新的空间,这和String采用构造方法创建字符串不入池相对应。