当前位置: 首页 > 面试题库 >

在Java中比较Integer包装器时,为什么128 == 128为false但127 == 127为true?

齐才艺
2023-03-14
问题内容
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之后发生变化,下面是代码段 有人可以帮我理解吗? 问题答案: 不,用于数字的常量池与用于字符串的方法不同。对于字符串,只保留编译时常量-而对于整数类型的包装器类型,如