盒装基元和等价

2022-09-03 09:18:17

所以今天有人问我这个问题。

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

这个程序会打印出什么?它返回 true。我回答说,它总是会打印出假的,因为我如何理解自动(和自动取消)拳击。我的印象是,分配 Integer a = 3 将创建一个新的 Integer(3),以便 == 将计算引用而不是基元值。

谁能解释一下?


答案 1

将缓存介于 -128 到 127 之间的框内值。Boxing使用方法,它使用缓存。范围外的值不会被缓存,并且始终作为新实例创建。由于您的值属于缓存范围,因此使用 == 运算符的值相等。Integer.valueOf

引用 Java 语言规范:

如果被装箱的值 p 是 true、false、一个字节、一个介于 \u0000 到 \u007f 范围内的 char,或者是一个介于 -128 和 127 之间的整数或短数字,则让 r1 和 r2 成为 p 的任意两个装箱转换的结果。总是 r1 == r2。

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


答案 2

这是真正发生的事情:

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


推荐