可能重复: 包装类和==运算符
似乎包装类的对象相等操作符会产生不同的结果,这取决于包装值是否在字节范围内。下面是演示此行为的代码片段:
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 (Build1.6.0_24-b07)上获得了这个输出。同样的情况发生在很长的时间里,也可能是很短的时间(不过还没有测试)。
注意:在linux下的其他HotSpot构建上的相同输出,有人能解释吗?
小编辑,只是为了使它稍微更有趣:
添加
if (i3 <= i4 && i3 >= i4) System.out.println("same after all...");
最后打印"same after all...
“。
发布于 2011-08-02 11:39:27
是这样的。JVM将在自动装箱小值时“缓存”并重用Integer
实例。
参见Java语言规范第5.1.7节拳击转换
如果被装箱的值p是
true
__,false
__,一个字节,在\u0000
到\u007f
__,范围内的一个字符,或者在-128到127__之间的一个int或短数,那么让r1和r2是p的任意两次装箱转换的结果。r1 == r2总是这样。
当比较使用Integer
的<
、>
、<=
和>=
时,与!=
和==
相比,值是不装箱的。
发布于 2011-08-02 12:05:54
-127到127之间的整数是“缓存”的,因此它们返回相同的引用,这意味着i1和i2指向同一个对象。
https://stackoverflow.com/questions/6911419
复制相似问题