所以今天我被问到这个问题。
Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
该程序将打印出来的内容是什么?它返回true。我回答它总会打印出来,因为我理解自动(和自动联合)拳击。我的印象是,分配整数a = 3将创建一个新的整数(3),这样= =将评估参考而不是原始值。
任何人都能解释一下吗?
答案 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
所以我猜通常你想在比较对象
时远离'=='