先推断下以下代码的输出结果
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验证下




java jdk缓存-128~127的Long与Integer的更多相关文章

  1. Java关于整型类缓存[-128,127]之间的数字

    我们在学习Java的包装类Integer.Long的时候可能会遇到这个问题: ①Integer a = 500;// Integer a = Integer.valueOf(500); 等价于上面的 ...

  2. Java Integer(-128~127)值的==和equals比较产生的思考

    最近在项目中遇到一个问题,两个值相同的Integer型值进行==比较时,发现Integer其中的一些奥秘,顺便也复习一下==和equals的区别,先通过Damo代码解释如下: System.out.p ...

  3. java byte为何范围是-128~127

    从我们接触Java的时候,就被告知基础类型byte是一个字节,占8位,表示的范围是-128~127.那么为什么会这个范围呢?   咱们先回顾一下计算机基础: 1. 在计算机内部数据的存储和运算都采用二 ...

  4. java内存缓存,节省内存

    缓存的对象 这个问题就是我们上面提到的极端情况,在Java中,会对-128到127的Integer对象进行缓存,当创建新的Integer对象时,如果符合这个这个范围,并且已有存在的相同值的对象,则返回 ...

  5. 有符号的范围,-128~+127详解(zt)

    这是一个困惑了我几年的问题,它让我对现在的教科书和老师极其不满,从我N年前开始摸电脑时,就几乎在每一本C++教科书上都说,8位有符号的取值范围是-128~+127,为什么不是-127~+127呢,后来 ...

  6. win10下安装java jdk,tomcat

    1.安装java jdk 去官网下载java jdk(http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-21 ...

  7. Redis中的Java分布式缓存

    为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家. 在提高应用程序的速度和性能时,每毫秒都是至关重要的.例如,根据Google的一项研究,如果网 ...

  8. byte类型的取值为什么是-128~127

    参考:https://blog.csdn.net/qq_22771739/article/details/84496115 https://blog.csdn.net/boatalways/artic ...

  9. byte的取值范围是-128~127,那么包含-128和127吗?

    本帖最后由 王德升老师 于 2019-12-27 17:56 编辑 byte的取值范围为什么是-128~127?如果面试官问你取值范围包含127吗?1. 首先我们知道Java中byte类型是1个字节占 ...

随机推荐

  1. 开源 自由 java CMS - FreeCMS1.8 网上申报

    项目地址:http://code.google.com/p/freecms/ 在线申报 1. 转交申报 用户能够把申报转交给其它人办理,系统会记录此申报的转交记录. 注意:同一时候仅仅能转交一个申报. ...

  2. gdb经常使用命令总结

    1: 对于在应用程序中增加參数进行调试的方法:    直接用 gdb app -p1 -p2 这样进行调试是不行的.    须要像下面这样使用:     #gdb app     (gdb) r -p ...

  3. 谈论高并发(二十二)解决java.util.concurrent各种组件(四) 深入了解AQS(二)

    上一页介绍AQS其基本设计思路以及两个内部类Node和ConditionObject实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇说一 ...

  4. Sandcastle生成帮助文档

    http://www.cnblogs.com/net515/p/3311584.html Sandcastle帮助文档生成器使用介绍 一.软件介绍       Sandcastle是一个管理类库的文档 ...

  5. projecteuler----&gt;problem=14----Longest Collatz sequence

    title: The following iterative sequence is defined for the set of positive integers: n n/2 (n is eve ...

  6. Android游戏源代码合集(主要是AndEngine和Libgdx的)

    近期在网络上看到有网友抱怨Android游戏源代码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源代码,以Eclipseproject的形式配置好环境,再陆续发出(某引擎避嫌,不在此 ...

  7. XMPP得知--建立一个管理类

    参考其他demo之后,设立一个管理类的发现看起来更舒服,理-- 但在建立与server连接其中.发现 Connect Error: {     NSLocalizedDescription = &qu ...

  8. Python日志输出格式和时间格式

    formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%b%d-%H:%M:% ...

  9. uitableView 选择跳过后, 跳回 颜色变化 问题

    今天遇到这个问题  谁也因此没有满足这方面的需求 今天会见 网上办理登机手续 未找到 好 我只能说自己的问题 但 幸好,kai哥 就攻克了 ! 就是在- (void)tableView:(UITabl ...

  10. STL内存分配

    STL内存创建 Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu  转载请标明来源 1.      Stl内存创建基类模板__malloc_alloc_tem ...