考虑这段代码:
class test {
public static void main(String[] args) {
test inst_test = new test();
int i1 = 2000;
int i2 = 2000;
int i3 = 2;
int i4 = 2;
Integer Ithree = new Integer(2); // 1
Integer Ifour = new Integer(2); // 2
System.out.println( Ithree == Ifour );
inst_test.method( i3 , i4 );
inst_test.method( i1 , i2 );
}
public void method( Integer i , Integer eye ) {
System.out.println(i == eye );
}
}
它打印:
false
true
false
我明白第一个false
, == 运算符仅检查两个引用是否作用于同一个对象,在本例中则不然。
下列true
and false
让我摸不着头脑。为什么Java会考虑i3
and i4
平等但是i1
and i2
不同的?两者都已包装为 Integer,不应该both评估为假?这种不一致有实际原因吗?
将基元自动装箱为对象(如您的调用中所使用的那样)method
使用小值的缓存。来自Java 语言规范第 5.1.7 节 http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#190697:
如果装箱的值 p 为真,
false,一个字节,范围内的一个字符
\u0000 到 \u007f,或者 int 或短整型
-128 到 127 之间的数字,然后令
r1 和 r2 是任意两个的结果
p的拳击转换。它总是
r1 == r2 的情况。
紧随其后的规范讨论部分也很有趣。值得注意的是,JVM 可以缓存more如果需要的话,你不能确定这样做的结果:
Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)