-4

代码:

Integer a1 = 100;
Integer a2 = 100;
System.out.println(a1 == a2);   // true

Integer b1 = new Integer(100);
Integer b2 = new Integer(100);
System.out.println(b1 == b2);   // false

Integer c1 = 150;
Integer c2 = 150;
System.out.println(c1 == c2);   // false  

Java 设计在使用 AutoBoxing 时,-128 和 127 之间的值似乎引用相同的 Integer 对象,这导致第一个代码片段和最后一个代码片段的结果不同

我的问题是:java为什么要这样设计,有什么好处吗?

4

3 回答 3

3

简单的理由是,拥有一组已经创建并可用于装箱的整数是有用/高效的。如果应用程序需要装箱的整数,它们很可能会在某个范围内(例如 1...随便)。它们被装箱到 -127/128 的事实是一种简单的设计启发式,它基于在不预先装箱大量整数的情况下可能提供的好处。

于 2012-11-16T13:21:28.717 回答
2

这是一种优化,因为许多数值运算都在上述区间内使用 int 值。

于 2012-11-16T13:20:57.053 回答
2

为 -128 和 127 之间的值缓存整数。这是Java 语言规范的一部分:

如果被装箱的值 p 是真、假、一个字节或 \u0000 到 \u007f 范围内的一个字符,或者一个介于 -128 和 127(含)之间的 int 或短数字,则令 r1 和 r2 为p 的任意两个拳击转换。r1 == r2 总是如此。

该行为的原因在同一部分中给出:默认行为是==比较总是返回 true,但出于性能原因,它被限制在该范围内。

理想情况下,对给定的原始值 p 进行装箱将始终产生相同的参考。在实践中,使用现有的实现技术这可能是不可行的。[...]
这个[范围限制]确保在大多数常见情况下,行为将是期望的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有 char 和 short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。

于 2012-11-16T13:21:09.840 回答