编辑:好的,好的,我读错了。我没有将int与Integer进行比较。适当注意。
我的SCJP书说:
当==用于将原语与包装器进行比较时,包装器将被展开,并且比较将是原语与原始的比较。
因此,您会认为此代码将打印true
:
Integer i1 = 1; //if this were int it'd be correct and behave as the book says.
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
但它打印false
。
另外,根据我的书,这应该打印true
:
Integer i1 = 1000; //it does print `true` with i1 = 1000, but not i1 = 1, and one of the answers explained why.
Integer i2 = 1000;
System.out.println(i1 != i2);
不。是false
。
是什么赋予了?
Integer i1 = 1;
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
当您为该i1
值分配1时,将装箱,创建一个Integer
对象。然后比较将两个对象引用进行比较。引用不相等,因此比较失败。
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 != i2);
因为这些都是用编译时常量初始化的,所以编译器可以并且确实将它们进行内插,并使两者都指向同一Integer
对象。
(请注意,我将值从1000更改为100。正如@NullUserException指出的那样,仅会插入小整数。)
这是一个非常有趣的测试。看看是否可以解决这个问题。为什么第一个程序打印true
,而第二个程序打印false
?使用装箱和编译器时间分析的知识,您应该能够弄清楚这一点:
// Prints "true".
int i1 = 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);
// Prints "false".
int i1 = 0;
Integer i2 = new Integer(i1);
i1 += 1;
System.out.println(i1 == i2);
如果您了解上述内容,请尝试预测该程序的输出:
int i1 = 0;
i1 += 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);
(猜测之后,运行它即可查看!)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句