自动装箱问题

时间:2011-07-27 16:21:35

标签: java autoboxing

  

可能重复:
  Wrapper class and == operator

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

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


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

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

2 个答案:

答案 0 :(得分:7)

因为JVM缓存并重用了前几个Integer个对象(确切地说是-128到127,包括-128到127),所以i1i2是对相同的物理对象。

LongShortByte btw也是如此。有关更详细的说明,请参阅this article

答案 1 :(得分:3)

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

除此之外,JVM 可以使用更大的缓存,但不能保证。来自JLS section 5.1.7

  

如果被装箱的值p为真,假,一个字节,范围为\ u0000到\ u007f的字符,或者介于-128和127之间的整数或短数,则让r1和r2为任意结果p的两次拳击转换。始终是r1 == r2。

的情况