Java包装类对象相等 - 奇怪的行为

时间:2011-08-02 11:37:44

标签: java object wrapper equality

  

可能重复:
  Wrapper class and == operator

似乎包装类的对象相等运算符会产生不同的结果,具体取决于包装的值是否在字节范围内。以下是演示此行为的代码段:

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...”。

2 个答案:

答案 0 :(得分:4)

这是对的。在自动装箱小值时,JVM将“缓存”并重用Integer个实例。

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

  

如果列入的值为truefalse,则为\u0000\u007f或在-128和127之间的int或短数,然后让r1和r2成为p的任意两次装箱转换的结果。始终是r1 == r2。

的情况

使用Integer<><=比较>=时,值与!=相对,而不是== {{1}}。

答案 1 :(得分:2)

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

相关问题