整数包装器对象只在值127内共享相同的实例?在这里,它们是相同的实例: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内共享同一个实例?
3 回答

白衣染霜花
TA贡献1796条经验 获得超10个赞
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); }

胡子哥哥
TA贡献1825条经验 获得超6个赞
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 == trueInteger 128 == falseInteger 127 system hash code 1787303145, Integer 128 system hash code 202703779Integer 127 system hash code 1787303145, Integer 128 system hash code 1584673689Integer 127 system hash code 1787303145, Integer 128 system hash code 518500929Integer 127 system hash code 1787303145, Integer 128 system hash code 753416466Integer 127 system hash code 1787303145, Integer 128 system hash code 1106961350

温温酱
TA贡献1752条经验 获得超4个赞
如果值 p
被装箱 true
,false
.. byte
,或 char
在范围内 \u0000
到 \u007f
,或 int
或 short
编号在-128和127之间(包括在内),然后让 r1
和 r2
的任何两个装箱转换的结果。 p
..总是这样 r1 == r2
.
理想情况下,对给定的原语值进行装箱。 p
,总能得到相同的引用。在实践中,使用现有的实现技术,这可能是不可行的。上述规则是一种务实的妥协。上面的最后一个子句要求某些公共值总是被装箱到不可区分的对象中。实现可能缓存这些,懒惰或急切。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不需要)共享部分或所有这些引用。
这确保了在大多数常见情况下,行为将是理想的行为,而不会造成不适当的性能损失,特别是在小型设备上。例如,内存有限的实现可能会缓存所有 char
和 short
价值,以及 int
和 long
值在-32K到+32K之间。
添加回答
举报
0/150
提交
取消