0%

Integer拆装箱问题

Integer拆装箱问题

来看一个小题目

1
2
3
4
5
6
7
Integer a = 2;
Integer b = 2;
Integer c = 200;
Integer d = 200;

System.out.println(a == b); // true
System.out.println(c == d); // false

这是为啥呢,同样是比较两个相等的数,怎么一个是true一个是false呢

这是因为在编译时,如果发现有将基本类型int赋值给包装类性Integer,会将其编译为Integer.valueOf(int),如果将包装类Integer赋值给基本类型int,则会自动调用intValue方法,这就是自动拆装箱

既然会自动调用Integer.valueOf(int),那就看一下该方法吧

1
2
3
4
5
6
public static Integer valueOf(int i) {
// IntegerCache.low是-128,IntegerCache.high是127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

可以看到在-128和127数值之间,会直接读取IntegerCache.cache中的值,既然这些值都是被cache的,所以这些值对应的同一个数字的Integer对象是在同一块内存地址,而不在这个范围的数字,就会实例化一个新的Integer