zoukankan      html  css  js  c++  java
  • 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验证下




  • 相关阅读:
    P、NP及NPC问题
    latex test3
    latex test2
    test
    整体二分
    bzoj2819 nim (树上带修改查询路径异或和)
    kmp模板题
    KM的三种写法比较
    电视转播
    树状数组处理区间查询和区间修改的问题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4515249.html
Copyright © 2011-2022 走看看