Java 盒基元与等价

Java 盒基元与等价,java,autoboxing,equivalence,Java,Autoboxing,Equivalence,所以今天有人问我这个问题 Integer a = 3; Integer b = 2; Integer c = 5; Integer d = a + b; System.out.println(c == d); 这个程序将输出什么?这是真的。我回答它总是打印为false,因为我是如何理解自动(和自动取消)装箱的。我的印象是,分配整数a=3将创建一个新的整数(3),以便an==将计算引用,而不是原语值 有人能解释一下吗?缓存-128到127之间的装箱值。装箱使用Integer.valueOf方法,

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

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
这个程序将输出什么?这是真的。我回答它总是打印为false,因为我是如何理解自动(和自动取消)装箱的。我的印象是,分配整数a=3将创建一个新的整数(3),以便an==将计算引用,而不是原语值


有人能解释一下吗?

缓存-128到127之间的装箱值。装箱使用
Integer.valueOf
方法,该方法使用缓存。不缓存范围之外的值,并始终将其创建为新实例。由于您的值属于缓存范围,因此使用==运算符可以使值相等

引用Java语言规范:

如果要装箱的值p为真, false,一个字节,一个字符 \u0000到\u007f,或整型或短型 介于-128和127之间的数字,然后让 r1和r2可以是任意两个的结果 p。总是这样 r1==r2的情况。


这就是真正发生的事情:

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

这是因为一些(自动装箱)的整数被缓存,所以你实际上是在比较同一个引用——有更详细的例子和解释。

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

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

因此,我想,在比较对象时,通常您希望远离“==”

+1:你们知道的太多了:)能否提供一些文档的链接,让我们了解更多有关缓存的内容。查看JDK的源代码。转到src.zip/java/lang/Integer.java并查找“cache=newinteger[256];”。这就是初始化。接下来,查找“公共静态整数值(inti)”。这是一种使用缓存在每次请求其中一个值时返回缓存的实例的方法。java.lang.Character还有一个cachéfor chars,介于unicodes 0和127之间(ascii-7/us ascii)。所有答案都很好,并且相当相等。Peter因为速度得到了它:)FindBugs是一个分析代码的好工具,可以从这个特性中获益:你是对的。这是缓存在
valueOf
方法中实现的结果。是的,但有趣的是,不是在Integer.valueOf(字符串s)中实现的。真是一团糟六四事件法轮功包卓轩 我的怎么可能是四年前被问到的那个的复制品呢。让我们至少考虑一下具有重复帖子的事件顺序,但是可能的副本更合适,前一个是错误的。但也许两者都错了;-)