似乎包装类的对象相等运算符会产生不同的结果,具体取决于包装的值是否在字节范围内。以下是演示此行为的代码段:
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...
”。
答案 0 :(得分:4)
这是对的。在自动装箱小值时,JVM将“缓存”并重用Integer
个实例。
请参阅Java语言规范Section 5.1.7 Boxing Conversion:
如果列入的值为
的情况true
,false
,则为\u0000
到\u007f
,或在-128和127之间的int或短数,然后让r1和r2成为p的任意两次装箱转换的结果。始终是r1 == r2。
使用Integer
,<
,>
和<=
比较>=
时,值与!=
相对,而不是==
{{1}}。
答案 1 :(得分:2)
-127和127之间的整数是'缓存',因此它们返回相同的引用,这意味着i1和i2指向同一个对象。