整数指的是同一个对象

时间:2012-11-16 13:18:56

标签: java

代码:

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会像这样设计它,有什么优势吗?

3 个答案:

答案 0 :(得分:3)

简单的基本原理是,有一组已经创建并可用于装箱的整数是有用/有效的。如果应用程序需要盒装整数,它们很可能会在某个范围内(例如1 ......等等)。事实上,他们的盒装高达-127/128是一个简单的设计启发式,它基于什么可能提供的好处,而无需预先装入大量的整数。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

为-128到127之间的值缓存整数。这是Java Language Specification的一部分:

  

如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。

的情况

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

  

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