一、什么是自动装箱、自动拆箱
此机制开始于jdk 1.5
java中有8种基本类型,对应8种基本类型有8个包装类。
整形 | 实型 | 布尔型 | 字符型 |
---|---|---|---|
long/int/short/byte | float/double | boolean | char |
Long/Integer/Short/Byte | Float/Double | Boolean | Character |
1、自动装箱 : 在进行运算的过程中(一般是赋值运算),基本类型的值转换成对应包装类型的对象。底层调用静态方法
Integer.valueof(int i)
方法
Integer a = 1;
实际上,在编译之后是 integer a = Integer.valueof(1)
public static Integer valueOf(int i) {
/**IntegerCache.low = -128
IntegerCache.high = 127
IntegerCache 是Integer对象的缓存器
*/
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
它的执行过程是这样的:当i的值在-128到127之间时,返回的是缓存器中缓存的对象,否则返回的是新创建的对象。因此
Integer a = 1 ; Integer b = 1;
a==b // 结果为true,a和b都是对象,比较的是地址。
2、自动拆箱 : 在进行运算的过程中(赋值、算数、比较运算等),包装类型的对象转换成对应基本类型的值。底层调用实例方法Integer.intValue()
Integer a = new Integer(1);
int b = a;
实际上执行的是:int b = a.intValue();
public int intValue() {
return value;
}
3、其他
当包装类型和基本类型进行除赋值运算之为的运算时,包装类型自动拆箱。这容易理解,包装类型的变量是对象的地址,是不能进行像加减乘除等运算的。
Integer a = new Integer(1);
int b = 2;
boolean bool = a < b;
实际执行: boolean bool = a.intValue() < b;
二、练习题
public void testEquals() {
int int1 = 12;
int int2 = 12;
Integer integer1 = new Integer(12);
Integer integer2 = new Integer(12);
Integer integer3 = new Integer(127);
Integer a1 = 127;
Integer a2 = 127;
Integer a = 128;
Integer b = 128;
int temp = b;
System.out.println("int1 == int2 -> " + (int1 == int2));
System.out.println("int1 == integer1 -> " + (int1 == integer1));
System.out.println("integer1 == integer2 -> " + (integer1 == integer2));
System.out.println("integer3 == a1 -> " + (integer3 == a1));
System.out.println("a1 == a2 -> " + (a1 == a2));
System.out.println("a == b -> " + (a == b));
}