先推断下以下代码的输出结果
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. (算法入门经典大赛 优先级队列)LA 3135(之前K说明)

    A data stream is a real-time, continuous, ordered sequence of items. Some examples include sensor da ...

  2. 基于Cocos2dx开发卡牌游戏_松开,这三个国家

    1.它实现了动态读取地图资源.地图信息被记录excel桌格.假设你想添加地图,编者excel导入后CocoStudio数据编辑器,然后出口到Json档,到项目的Resource文件夹下. 2.SGFi ...

  3. 从控制台读取password - C#

    Tip :    从控制台读取password 语言: C# ______________________________________________________________ 在登陆Lin ...

  4. 猫学习IOS(五岁以下儿童)UI之360其他下载管理器广场UI

    猫分享.必须精品 下载材料:http://blog.csdn.net/u013357243/article/details/44486651 先看效果 主要是完毕了九宫格UI的搭建 代码 - (voi ...

  5. 从一开始,说出事java匿名内部类

    java内部类.匿名类原本以为它们的使用已经很滑, 成绩, 就在昨天晚上12指向时钟发生重大事故.事故的严重程度再说吧,那是因为我没有睡一晚睡眠. 那以下先用一段模拟代码来描写叙述下我出现的问题的: ...

  6. 【android】优秀的UI资源站点集合

    1.http://ionicons.com/ 这个站点的图标能满足大部分人的需求.里面包括了经常使用的android风格的图标 ios7风格的图标 以及一些社会化分享图标,总共500个左右.githu ...

  7. windows API与C#的数据类型对应关系表

    API与C#的数据类型对应关系表 API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型 WORD 16位无符号整数 ushort CHAR 字符 char LONG 32位无符号整数 ...

  8. android 上手维修设备和推断启动服务

    下载链接:http://download.csdn.net/detail/a123demi/7511823 我们经常在开发的时候,通过获取系统已启动的服务来推断该server是否还须要再启动. 而本文 ...

  9. 关于WCF的引用,添加服务和添加web服务的区别

    原文:关于WCF的引用,添加服务和添加web服务的区别 本章内容主要是根据我做的实验来阐述这2种添加服务针对WCF的不同之处,我们按照示例一步一步来看. 如下是工程的结构: 该WCF服务是通过控制台程 ...

  10. activity-alias使用

    activity-alias这是android为了重新使用Activity设计. 当Activity的onCreate()在方法,运行getIntent().getComponent().getCla ...