class D { public static void main(String args[]) { Integer b2=128; Integer b3=128; System.out.println(b2==b3); } }
输出:
false
class D { public static void main(String args[]) { Integer b2=127; Integer b3=127; System.out.println(b2==b3); } }
true
注意:-128 到 127 之间的数字为真。
当您在 Java 中编译数字文字并将其分配给整数(大写I)时,编译器会发出:
I
Integer b2 =Integer.valueOf(127)
使用自动装箱时也会生成这行代码。
valueOf实现了某些数字被“池化”,并且它为小于 128 的值返回相同的实例。
valueOf
从 java 1.6 源代码,第 621 行:
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
可以使用系统属性将 的值high配置为另一个值。
high
-Djava.lang.Integer.IntegerCache.high=999
如果您使用该系统属性运行程序,它将输出 true!
显而易见的结论:永远不要依赖两个相同的引用,总是将它们与.equals()方法进行比较。
.equals()
因此b2.equals(b3),对于 b2,b3 的所有逻辑相等值,将打印 true。
b2.equals(b3)
请注意,Integer缓存不是出于性能原因,而是为了符合JLS,第 5.1.7 节;必须为值 -128 到 127(含)提供对象标识。
Integer
Integer#valueOf(int)也记录了这种行为:
通过缓存频繁请求的值,此方法可能会显着提高空间和时间性能。此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。