【发布时间】:2015-11-24 08:35:54
【问题描述】:
我在比较两段代码
Integer x = new Integer(0), y;
y=x;
x+=0;
System.out.println(x==y); // prints false
和
Integer x = 0, y;
y=x;
x+=0;
System.out.println(x==y); // prints true
不应该都返回false吗?它不是原始变量,即使在添加零之后,它也会在第二个代码中以某种方式打印true。我知道拳击(对于从 -128 到 127 的整数),但是为什么拳击在第二段代码中起作用,而不是在第一段代码中起作用?
【问题讨论】:
-
不,因为
-128 - 127范围内的Integer正在被缓存。在您的第一个示例中,您明确创建了一个新的Integer,尽管-128 - 127范围内的每个Integer都将引用同一个对象。 -
尽管其他答案说 -128 - 127 不是教条,它只是 JVM 的一个特性,可以在某些具有
-Djava.lang.Integer.IntegerCache.high属性的版本上进行调整,默认值可能与 JVM 有很大不同JVM,你永远不应该依赖这种行为!见stackoverflow.com/questions/15052216/…