盒装基元和等价

时间:2010-01-07 15:29:22

标签: java autoboxing equivalence

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

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);

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

任何人都能解释一下吗?

4 个答案:

答案 0 :(得分:20)

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

引用Java语言规范:

  

如果装箱的值p为真,   false,一个字节,范围内的char   \ u0000到\ u007f,或 int或short   在-128和127之间的数字,然后让   r1和r2是任意两个的结果   p的拳击转换它始终是   r1 == r2。

的情况

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

答案 1 :(得分:11)

这才是真正发生的事情:

Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());

Java在-128到127之间维护Integer个对象的缓存。与以下内容进行比较:

Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);

哪个应打印false

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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);

这将打印:

false
false
true

所以我猜通常你想在比较对象

时远离'=='