自动拆箱和装箱就是,计算数值时,integer会自动转为int进行计算。而当int传入类型为integer的引用时,int数值又会被包装为integer。
装箱就是自动将基本数据类型转换成包装器类型;拆箱就是自动将包装类型转换为基本数据类型;
Integer i = new Integer(10); //以前要生成数值10的Integer对象
Integer i = 10; //装箱
int n = i; //拆箱
- 总结:装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。
对于new Integer(10)和Integer.valueOf(10)区别在于:
- new Integer(10) 每次都会新建一个对象;
- Integer.valueOf(10) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer x = new Integer(10);
Integer y = new Integer(10);
System.out.println(x == y); // false
Integer z = Integer.valueOf(10);
Integer k = Integer.valueOf(10);
System.out.println(z == k); // true
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); // true
System.out.println(i3==i4); // false
这是由于缓存池的设置,由于valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。如果不是会new一个新的对象
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
由下可知创建Integer对象时数值的范围在[-128,127],所以200会显示false。
基本类型对应的缓冲池如下:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F