云计算百科
云计算领域专业知识百科平台

揭秘Java中Integer128的隐藏陷阱

好的,我们来探讨Java中的“Integer128陷阱”。这是Java自动装箱机制和Integer对象缓存范围导致的一个常见问题。

现象描述

在Java中,对于Integer对象,当使用==运算符比较两个值为-128到127之间的Integer对象时,结果可能为true;但当比较两个值相同但超出此范围的Integer对象(例如都为128)时,结果却可能为false。例如:

Integer a = 127;
Integer b = 127;
System.out.println(a == b); // 输出 true

Integer c = 128;
Integer d = 128;
System.out.println(c == d); // 输出 false

原因分析

  • 自动装箱与缓存池:

    • Java对Integer类型在-128到127之间(默认范围)的值维护了一个静态缓存池。
    • 当通过自动装箱(如Integer a = 127;)创建对象时,JVM会优先从缓存池中返回已存在的对象引用。
    • 因此,a和b指向同一个缓存对象,==比较引用地址相同。
  • 超出缓存范围:

    • 对于值128(超出缓存范围),自动装箱会每次new一个新的Integer对象。
    • 因此c和d是两个不同的对象,==比较的是引用地址,结果为false。
  • 源码验证

    查看Integer.valueOf(int)方法:

    public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
    return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
    }

    解决方案

    使用equals()而非==比较对象内容:

    System.out.println(c.equals(d)); // 输出 true

    http://my.tv.sohu.com/us/442093011/698464610.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDYxMC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464468.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDQ2OC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464561.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU2MS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464731.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDczMS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464568.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU2OC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464579.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU3OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464588.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDU4OC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464652.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY1Mi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464812.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgxMi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464770.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDc3MC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464907.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkwNy5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464912.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkxMi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464917.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDkxNy5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464669.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY2OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464830.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgzMC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464837.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgzNy5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464788.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDc4OC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464688.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDY4OC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464800.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDgwMC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464862.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg2Mi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464869.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg2OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464879.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg3OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464883.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDg4My5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465020.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTAyMC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465128.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTEyOC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465135.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTEzNS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465035.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTAzNS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698464980.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NDk4MC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465154.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE1NC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465054.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTA1NC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465169.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE2OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465186.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE4Ni5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465190.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTE5MC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465090.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTA5MC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465326.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMyNi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465271.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTI3MS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465412.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQxMi5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465337.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMzNy5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465339.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTMzOS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465424.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQyNC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465434.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQzNC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465440.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTQ0MC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465518.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTUxOC5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465639.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTYzOS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465649.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTY0OS5zaHRtbA==.html
    http://my.tv.sohu.com/us/442093011/698465558.shtml
    https://tv.sohu.com/v/dXMvNDQyMDkzMDExLzY5ODQ2NTU1OC5zaHRtbA==.html
     

    equals()方法比较的是包装类内存储的int值是否相等,而非对象地址。

    总结

    • 陷阱本质:混淆了==(引用比较)与equals()(值比较)的语义。
    • 最佳实践:对包装类(Integer、Long等)的比较,始终使用equals()方法。
    • 扩展知识:缓存范围可通过JVM参数-XX:AutoBoxCacheMax=<size>调整上限(下限固定为-128)。

    理解此机制有助于避免在代码中引入隐蔽的Bug。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 揭秘Java中Integer128的隐藏陷阱
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!