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

sar*_*nan 40 java caching integer

这里他们是同一个实例:

Integer integer1 = 127;
Integer integer2 = 127;
System.out.println(integer1 == integer2);  // outputs "true"
Run Code Online (Sandbox Code Playgroud)

但在这里他们是不同的实例:

Integer integer1 = 128;
Integer integer2 = 128;
System.out.println(integer1 == integer2);  // outputs "false"
Run Code Online (Sandbox Code Playgroud)

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

axt*_*avt 35

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

JLS 5.1.7拳击转换:

如果该值p被装箱是true,false,一个byte,或一个char在所述范围内\u0000\u007fintshort-128和127(含)之间的数字,然后让和是任何两个装箱转换的结果.情况总是如此.r1r2pr1 == r2

理想情况下,装箱给定的原始值p总是会产生相同的参考.实际上,使用现有的实现技术可能不可行.上述规则是一种务实的妥协.上面的最后一个条款要求将某些常见值装入无法区分的对象中.实现可以懒惰地或急切地缓存这些.对于其他值,此公式不允许对程序员的盒装值的身份进行任何假设.这将允许(但不要求)共享部分或全部这些引用.

这确保了在大多数常见情况下,行为将是期望的行为,而不会造成过度的性能损失,尤其是在小型设备上.较少的内存限制的实施方式中可能,例如,高速缓存的所有charshort价值,以及intlong值中的-32K至+ 32K的范围内.

  • 请注意,JLS指定*minimum*cache/intern范围,而不是*maximum*(参见最后一句)...所以它在技术上"通过实现";-) (5认同)

Lac*_*lev 12

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);
    }
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 最新版本的Java 6支持将最大缓存值更改为大于127. (6认同)

Pet*_*rey 7

顺便说一句,你可以缩短你的代码

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));
}
Run Code Online (Sandbox Code Playgroud)

版画

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
Run Code Online (Sandbox Code Playgroud)

您可以看到每次127是相同的对象,而128的对象是不同的.