这里他们是同一个实例:
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内共享同一个实例?
答案 0 :(得分:35)
因为它是由Java语言规范指定的。
如果框中的值
p
为true
,false
,byte
或char
,范围为\u0000
到{ {1}},或者介于-128和127之间的\u007f
或int
个数字(含),然后让short
和r1
成为任意两次拳击转换的结果r2
。p
总是如此。理想情况下,装箱给定的原始值
r1 == r2
,总会产生相同的参考。实际上,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一个条款要求将某些常见值装入无法区分的对象中。实现可以懒惰地或急切地缓存这些。对于其他值,此公式不允许对程序员的盒装值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。这确保了在大多数情况下,行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,较少内存限制的实现可以缓存所有
p
和char
值,以及-32K到+ 32K范围内的short
和int
值。
答案 1 :(得分: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);
}
干杯!
答案 2 :(得分: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));
}
打印
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
你可以看到每次127是同一个对象,而128的对象是不同的。
答案 3 :(得分:1)
因为[-128,127]范围内的小值被缓存而更大的值不是。
要包装整数,Java使用http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html#valueOf%28int%29
答案 4 :(得分:1)
除了我要添加的其他答案之外,==
仅比较对象引用。请改用.equals()
:
Integer integer1=128;
Integer integer2=128;
if(integer1.equals(integer2))
System.out.println(true);
else
System.out.println(false);