Java Integer Cache — Why Integer.valueOf(127) == Integer.valueOf(127) I 大内容就是 Integer a = 127; Integer b = 127,然后为什么 a == b 等于 true
本文章主要介绍两个值相同的单独Integer对象,为什么==会是true。同理可以看到String不可以(通过new出来的对象)。
核心答案:从Integer a = 127代码角度上就是讲一个int数值赋值给一个Integer。实际上运行代码逻辑是Integer a = Integer.valueOf(127)。这是Java自动封装的特性。
Integer存在缓存机制,Integer.valueOf实际上从缓存中返回对应的对象。缓存的对象值范围是-128 to 127(该区间使用频率非常高,可以通过-XX:AutoBoxCacheMax设置范围)
Java八种基本类型是直接将值存在二进制位中,对比使用值。Java的已用类型是将对象地址存入二进制位中,对比使用地址对象导致就会出现不相等的情况。
所有基本类型都支持自动封装和自动解包的功能。如下:
Integer c = 128; // Compiler converts this line to Integer c = Integer.valueOf(128);
int e = c; // Compiler converts this line to int e = c.intValue();
注意:由于缓存数值存在范围,所有会出现以下两种不相同的情况
Integer a = 128; // Compiler converts this line to Integer a = Integer.valueOf(128);
Integer b = 128; // Compiler converts this line to Integer b = Integer.valueOf(128);
System.out.println(a == b); // Output -- false
Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
System.out.println(a == b); // Output -- true
通过查看Integer.valueOf的源码可以知道,传入对象会跟IntegerCache.low 和 IntegerCache.high做对比,确定是否使用缓存机制
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}