3

可能重复:
包装类和 == 运算符

当我学习自动装箱时,在网站上看到了这段代码。

Integer i1 = 1;  
Integer i2 = 1;  
// true 
System.out.println(i1 == i2);  


Integer i3 = -200;  
Integer i4 = -200;  
// false
System.out.println(i3 == i4);   

我可以理解为什么第二次比较给出错误(它的比较参考)。但是为什么第一个是真实的呢?

4

2 回答 2

7

因为前几个Integer对象(准确地说是从 -128 到 127,包括在内)被 JVM 缓存和重用,所以i1i2是对同一个物理对象的引用。

这也适用于Long,Short顺便Byte说一句。有关更详细的说明,请参阅本文。

于 2011-07-27T16:23:16.630 回答
3

装箱保证对一系列值使用相同的缓存对象。

除此之外,JVM可以使用更大的缓存,但不能保证。从 JLS部分 5.1.7

如果被装箱的值 p 是真、假、一个字节、一个在 \u0000 到 \u007f 范围内的字符,或者一个介于 -128 和 127 之间的 int 或短数字,则令 r1 和 r2 为任意两次装箱转换的结果p。r1 == r2 总是如此。

于 2011-07-27T16:26:49.177 回答