Java 整数包装器对象仅在值127内共享相同的实例?

Java 整数包装器对象仅在值127内共享相同的实例?,java,caching,integer,Java,Caching,Integer,在这里,它们是相同的实例: Integer integer1 = 127; Integer integer2 = 127; System.out.println(integer1 == integer2); // outputs "true" 但这里有不同的例子: Integer integer1 = 128; Integer integer2 = 128; System.out.println(integer1 == integer2); // outputs "false" 为什么包

在这里,它们是相同的实例:

Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);  // outputs "true"
但这里有不同的例子:

Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);  // outputs "false"

为什么包装器对象仅在值127内共享同一实例?

,因为它是由Java语言规范指定的

:

如果要装箱的值
p
true
false
字节
,或
char
\u0000
\u007f
范围内,或
int
介于-128和127(含)之间的数字,然后将
r1
r2
作为
p
的任意两个装箱转换的结果。通常情况下,
r1==r2

理想情况下,装箱一个给定的原语值
p
,将始终产生一个相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一条要求将某些公共值始终装箱到不可区分的对象中。实现可以延迟或急切地缓存这些数据。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不要求)共享部分或所有这些引用

这确保了在大多数常见情况下,行为将是所需的,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存有限的实现可能会缓存所有
char
short
值,以及-32K到+32K范围内的
int
long


因为[-128127]范围内的小值被缓存,而大值则不被缓存


要包装整数,Java使用Java.lang.Integer的源代码:

public static Integer valueOf(int i) {
        final int offset = 128;
        if (i >= -128 && i <= 127) { // must cache
            return IntegerCache.cache[i + offset];
        }
        return new Integer(i);
    }
公共静态整数值(int i){
最终整数偏移=128;

如果(i>=-128&&i除其他答案外,我还想添加
=
仅比较对象引用。请改用
.equals()

Integer integer1=128;
Integer integer2=128;
if(integer1.equals(integer2))
  System.out.println(true);
else
  System.out.println(false);

顺便说一句,您可以将代码缩短为

System.out.println("Integer 127 == " + ((Integer) 127 == (Integer) 127));
System.out.println("Integer 128 == " + ((Integer) 128 == (Integer) 128));

for(int i=0;i<5;i++) {
    System.out.println(
     "Integer 127 system hash code " + System.identityHashCode((Integer) 127)
     + ", Integer 128 system hash code "+System.identityHashCode((Integer) 128));
}

您可以看到127每次都是同一个对象,而128的对象则不同。

最新版本的Java 6支持将最大缓存值更改为大于127。我可以知道cachedIt的含义只是加载Integer类时创建和初始化的数组。为什么要将其设置为大小写?我无法获得它的小数字使用(例如在计算中),这可以防止JVM在每次{{x+1}}完成时分配新对象。请注意,JLS指定的是最小缓存/内部范围,而不是最大范围(参见最后一句)…因此从技术上讲,它是“通过实现”;-)他们为什么要这样做?我无法理解它并思考:他们所要做的就是允许操作符重载,而这一切在JNI之外都无法检测到。
Integer 127 == true
Integer 128 == false
Integer 127 system hash code 1787303145, Integer 128 system hash code 202703779
Integer 127 system hash code 1787303145, Integer 128 system hash code 1584673689
Integer 127 system hash code 1787303145, Integer 128 system hash code 518500929
Integer 127 system hash code 1787303145, Integer 128 system hash code 753416466
Integer 127 system hash code 1787303145, Integer 128 system hash code 1106961350