java jdk缓存-128~127的Long与Integer

先推断下以下代码的输出结果
Qa:----------------------------------------------
          Long a = Long.valueOf(127);
          Long b = Long.valueOf(127);
          System.out.println(a == b);
Qb:---------------------------------------------------
          Long a = Long.valueOf(128);
          Long b = Long.valueOf(128);
          System.out.println(a == b);
--------------------------------------------------------
Qa:true 
Qb:false

当时发现这个的问题起因是有同事把一个id属性由long改为大Long,导致一些地方用=比較id值出现了不一致的情况,终于导致了使用我们产品的部分人反馈某些功能不能够使用了,我这里所说的部分人就是那些人持有的id属性值超过127的用户。

非常明显,这些地方不能够用 == 去比較两个Long类型,这也反映一个程序猿的细心程度,小心转换这样的基本类型到自己定义类型。我这里主要解释下为什么-128~127 用==返回true。

看jdk关于Long类型的源代码:
public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache
        return LongCache.cache[(int)l + offset];
    }
        return new Long(l);
    }

  private static class LongCache {
    private LongCache(){}

    static final Long cache[] = new Long[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
        cache[i] = new Long(i - 128);
    }
    }

能够看到-128到127间的值北放到了一个数组中,即代码中的LongCache.cache[],所以我们拿到的是同一个实例,同理其他大类型也是相同,能够在看下Integer验证下




posted @ 2015-05-19 18:33  zfyouxi  阅读(1670)  评论(0编辑  收藏  举报