gpt4 book ai didi

java - 在比较 Java 中的整数包装器时,为什么 128==128 为假,而 127==127 为真?

转载 作者:行者123 更新时间:2023-12-02 01:22:15 27 4
gpt4 key购买 nike

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)时,编译器会发出:

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);
}

high 的值可以通过系统属性配置为其他值。

-Djava.lang.Integer.IntegerCache.high=999

如果您使用该系统属性运行程序,它将输出 true!

显而易见的结论:永远不要依赖两个相同的引用,始终使用 .equals() 方法比较它们。

因此,b2.equals(b3) 将为 b2、b3 的所有逻辑相等值打印 true。

请注意,Integer 缓存不存在是出于性能原因,而是为了符合 JLS, section 5.1.7 ;必须为 -128 到 127(包括 -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 - 在比较 Java 中的整数包装器时,为什么 128==128 为假,而 127==127 为真?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57615197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com