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);
}
high可以使用system属性将的值配置为另一个值。
-Djava.lang.Integer.IntegerCache.high = 999
如果使用该系统属性运行程序,它将输出true!
显而易见的结论是:永远不要依赖两个相同的引用,始终将它们与.equals()
方法进行比较。
因此,b2.equals(b3)
对于b2,b3的所有逻辑相等值,将输出true。
请注意,Integer
出于性能原因不存在缓存,而是为了符合JLS,第5.1.7节;必须为-128至127(含)之间的值指定对象标识。
Integer#valueOf(int)也记录此行为:
只是想知道,为什么在-128到127之间? Integer.valueOf()文档说明它“缓存频繁请求的值”。但是和之间的值是否经常被请求为真实值?我认为经常要求的价值是非常主观的。 这背后有没有可能的原因? 从文档中还说明:“..并可能缓存此范围之外的其他值。” 如何实现?
问题内容: 我想使用条件比较两个 Long 对象的值。当这些值 小于128时 ,条件将正常工作,但是当这些 值大于或等于128时 ,比较将失败。 例: 上面代码的比较正常进行,但是下面代码失败: 为什么将 Long 变量与 大于127的 值进行比较会出现问题?如果将变量数据类型更改为 长原语 ,则比较适用于所有情况。 问题答案: TL; DR Java将装箱的Integer实例从缓存到。由于您用于
问题内容: 关于我之前的问题,为什么与Integer.valueOf(String)进行==比较会得出127和128的不同结果?,我们知道Integer class有一个缓存用于存储-128和之间的值127。 只是想知道为什么在-128和127之间? Integer.valueOf()文档指出,它“ 缓存经常请求的值 ”。但是,-128和之间的值127是否经常被要求是真实的?我认为经常要求的价值观
我已经阅读了这个问题的答案,但是我仍然不知道它如何返回以及为什么第二行中的代码返回。
问题内容: 我无法理解Java常量池常量的工作方式。 我了解字符串的行为,因此可以证明自己与整数常量也是如此。 所以,对于整数 和 直到这里一切都进入我的脑海。 我无法理解的是,当我从127增加整数时,它的行为有所不同。此行为在127之后发生变化,下面是代码段 有人可以帮我理解吗? 问题答案: 不,用于数字的常量池与用于字符串的方法不同。对于字符串,只保留编译时常量-而对于整数类型的包装器类型,如