为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕村9548890 2019-07-09 15:03:09
整数包装器对象只在值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个赞

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);
    }

干杯!


查看完整回答
反对 回复 2019-07-09
?
胡子哥哥

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

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


查看完整回答
反对 回复 2019-07-09
?
温温酱

TA贡献1752条经验 获得超4个赞

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

JLS 5.1.7拳击转换:

如果值p被装箱truefalse..byte,或char在范围内\u0000\u007f,或intshort编号在-128和127之间(包括在内),然后让r1r2的任何两个装箱转换的结果。p..总是这样r1 == r2.

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

这确保了在大多数常见情况下,行为将是理想的行为,而不会造成不适当的性能损失,特别是在小型设备上。例如,内存有限的实现可能会缓存所有charshort价值,以及intlong值在-32K到+32K之间。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 332 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号