【问题标题】:Java wrapper classes object equality - odd behaviour [duplicate]Java包装类对象相等 - 奇怪的行为[重复]
【发布时间】:2011-08-02 11:37:43
【问题描述】:

可能重复:
Wrapper class and == operator

似乎包装类的对象相等运算符会根据包装值是否在字节范围内产生不同的结果。下面是一段代码 sn-p 来演示这种行为:

System.out.println("smaller than byte");

Integer i1 = 1;

Integer i2 = 1;

if (i1 == i2) System.out.println("same");

if (i1 != i2) System.out.println("not same");

System.out.println("larger than byte");

Integer i3 = 128;

Integer i4 = 128;

if (i3 == i4) System.out.println("same");

if (i3 != i4) System.out.println("not same");

产生以下输出:

smaller than byte

same

larger than byte 

not same

注意:我在 linux 上的 HotSpot (build 1.6.0_24-b07) 上得到了这个输出。 Long 和 Short 也一样(虽然还没有测试过)。

注意:Linux 下其他 HotSpot 版本的输出相同 谁能解释一下?


小修改,只是为了让它更有趣一点:

添加

if (i3 <= i4 && i3 >= i4) System.out.println("same after all...");

最后,打印“same after all...”。

【问题讨论】:

    标签: java object wrapper equality


    【解决方案1】:

    没错。当自动装箱小值时,JVM 将“缓存”并重用 Integer 实例。

    请参阅 Java 语言规范Section 5.1.7 Boxing Conversion

    如果被装箱的值 p 是truefalse、一个字节、一个在\u0000\u007f 范围内的字符,或一个介于 -128 和127,则令 r1 和 r2 为 p 的任意两次装箱转换的结果。 r1 == r2 总是如此。

    当使用 &lt;&gt;&lt;=&gt;= 比较 Integers 时,与 !=== 相比,这些值是未装箱的。

    【讨论】:

    • 谢谢 - 我目前正在为 SCJP 学习,并在官方学习指南中找到了一个类似的例子 - 作者对这种行为的解释是不同的(显然是错误的!)
    • @maciek:真的吗?您能告诉我们您认为哪个来源是错误的,或者提供一个简短的摘录吗?
    • 好吧,我似乎还没有仔细阅读它。它实际上在文本中进一步说明这种行为仅适​​用于 -128 和 127 之间的 Short 和 Integer。我的错
    【解决方案2】:

    -127 和 127 之间的整数被“缓存”,因此它们返回相同的引用,这意味着 i1 和 i2 指向同一个对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多