当我了解自动装箱时,在网站上看到了这段代码。
Integer i1 = 1;
Integer i2 = 1;
// true
System.out.println(i1 == i2);
Integer i3 = -200;
Integer i4 = -200;
// false
System.out.println(i3 == i4);
我能理解为什么第二次比较会给出错误(比较参考文献)。但为什么它会给第一个真实的呢?
答案 0 :(得分:7)
因为JVM缓存并重用了前几个Integer
个对象(确切地说是-128到127,包括-128到127),所以i1
和i2
是对相同的物理对象。
对Long
,Short
和Byte
btw也是如此。有关更详细的说明,请参阅this article。
答案 1 :(得分:3)
保证拳击对一系列值使用相同的缓存对象。
除此之外,JVM 可以使用更大的缓存,但不能保证。来自JLS section 5.1.7:
如果被装箱的值p为真,假,一个字节,范围为\ u0000到\ u007f的字符,或者介于-128和127之间的整数或短数,则让r1和r2为任意结果p的两次拳击转换。始终是r1 == r2。
的情况