嘿,我想了解下面的代码片段.
public static void main(String[] args) { Integer i1 = 1000; Integer i2 = 1000; if(i1 != i2) System.out.println("different objects"); if(i1.equals(i2)) System.out.println("meaningfully equal"); Integer i3 = 10; Integer i4 = 10; if(i3 == i4) System.out.println("same object"); if(i3.equals(i4)) System.out.println("meaningfully equal"); }
此方法运行所有println指令.那是i1!= i2是真的,但是i3 == i4.乍一看这让我觉得奇怪,它们应该是不同的参考.我可以弄清楚,如果我将相同的字节值(-128到127)传递给i3和i4,它们将始终等于引用,但任何其他值将使它们不同.
我无法解释这一点,您能指出一些文档或提供一些有用的见解吗?
谢谢
解决方法
将int值自动装箱到Integer对象将使用缓存来获取常用值(因为您已经识别它们).这在
JLS at §5.1.7 Boxing Conversion中指定:
If the value
p
being Boxed istrue
,false
,abyte
,achar
in the range\u0000
to\u007f
,or anint
orshort
number between-128
and127
,then letr1
andr2
be the results of any two Boxing conversions ofp
. It is always the case thatr1 == r2.
请注意,仅当语言为您自动为您设置值或使用Integer.valueOf()
时才会应用此选项.使用new Integer(int)
将始终生成新的Integer对象.
次要提示:JVM实现也可以自由地缓存这些范围之外的值,因为没有指定相反的值.但是,我还没有看到这样的实现.