盒装基元和等价

Joh*_*int 15 java autoboxing equivalence

所以我今天被问到这个问题.

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
Run Code Online (Sandbox Code Playgroud)

这个节目打印出来的是什么?它返回true.我回答它总会打印出来,因为我理解自动(和自动联合)拳击.我的印象是,分配整数a = 3将创建一个新的整数(3),以便==将评估参考而不是原始值.

有谁能解释一下?

Pet*_*aný 20

高速缓存介于-128到127之间的盒装值.拳击使用Integer.valueOf方法,它使用缓存.超出范围的值不会被缓存,并始终作为新实例创建.由于您的值属于缓存范围,因此使用==运算符值相等.

引用Java语言规范:

如果被装箱的值p为true,false,一个字节,范围为\ u0000到\ u007f的char,或者介于-128和127之间int或短号,则让r1和r2为任意两个装箱转换的结果p.始终是r1 == r2的情况.

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7


Dav*_*ant 11

这就是真正发生的事情:

Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());
Run Code Online (Sandbox Code Playgroud)

Java维护Integer-128到127之间的对象缓存.与以下内容比较:

Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);
Run Code Online (Sandbox Code Playgroud)

哪个应该打印false.


Rah*_*thy 5

这是因为一些(自动装箱的)整数被缓存,所以你实际上是在比较相同的参考 - 这篇文章有更详细的例子和解释.


Dav*_*oko 5

缓存也发生在自动装箱之外,考虑一下:

Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);

System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);
Run Code Online (Sandbox Code Playgroud)

这将打印:

false
false
true
Run Code Online (Sandbox Code Playgroud)

==一般来说,在比较对象时你要远离