当比较Java中的Integer包装器时,为什么128 == 128 false但127 == 127为真?
作者:互联网
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中编译数字文字并将其分配给Integer(大写I)时,编译器会发出:
Integer b2 =Integer.valueOf(127)
使用自动装箱时也会生成此行代码.
valueOf的实现使得某些数字被“合并”,并且它为小于128的值返回相同的实例.
从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);
}
可以使用system属性将high的值配置为其他值.
-Djava.lang.Integer.IntegerCache.high=999
如果您使用该系统属性运行程序,它将输出true!
明显的结论是:永远不要依赖两个引用相同,总是将它们与.equals()方法进行比较.
因此b2.equals(b3)将对所有逻辑上相等的b2,b3值打印为true.
请注意,出于性能原因,Integer缓存不存在,而是符合JLS, section 5.1.7;必须为-128到127(包括端点)的值给出对象标识.
Integer#valueOf(int)还记录了这种行为:
this method is likely to yield significantly better space and time performance by caching frequently requested values. This method will always cache values in the range -128 to 127, inclusive, and may cache other values outside of this range.
标签:java,integer,pass-by-reference,pass-by-value,comparison 来源: https://codeday.me/bug/20190911/1802768.html