先推断下以下代码的输出结果
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】java Integer 缓存 一定是 -128~127 吗

    1.概述 我们都知道 java Integer是有缓存的,缓存范围是 -128~127.但是这个值是一定的吗? 不一定.看源码.缓存大小居然可以改变 /*** Cache to support the ...

  2. Java--Integer的常量缓存池(默认-128~127数值范围)

    JDK1.5之后,新增了自动拆.装箱功能,如以前创建一个Integer对象,需要 使用 "new"关键字 而现在Java中可以直接赋值如下: Integer不是new出Intege ...

  3. Java中的AutoBoxing (Integer对-128~127之间数值的特殊处理)

      理解Java中Integer和int的Autoboxing,有助于java新手理解java内存机制.   在Java中的,Integer和int是可以Autoboxing和boxing的,这里要注 ...

  4. Java 数据类型缓存池

    package com.study.DataType;import org.junit.Test;/*** @Description 常量缓冲池* @Classname IntegerDemo* @D ...

  5. Integer的值范围-128~127

    看到一道面试题,这个面试题是这样的. public class Foo {public static void main(String[] args) {Integer a = 120,b = 160 ...

  6. 【开源与项目实战:开源实战】77 | 开源实战一(下):通过剖析Java JDK源码学习灵活应用设计模式

    上一节课,我们讲解了工厂模式.建造者模式.装饰器模式.适配器模式在 Java JDK 中的应用,其中,Calendar 类用到了工厂模式和建造者模式,Collections 类用到了装饰器模式.适配器 ...

  7. Java数据类型缓存池

    常量缓存池 package com.study.DataType;import org.junit.Test;/*** @Description 常量缓冲池* @Date 2021/9/5 10:56 ...

  8. Java JDK 11:现在可以使用所有新功能

    为什么80%的码农都做不了架构师?>>>    删除了CORBA,Java EE和JavaFX支持,但添加了十几个主要新功能 目录 哪里可以下载JDK 11 Java 11 JDK中 ...

  9. Java JDK代理、CGLIB、AspectJ代理分析比较

    前言 什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问.在不修改源代码的基础上做方法增强,代理是一种设计模 ...

最新文章

  1. vim切换编程语言_把 Vim 打造成源代码编辑器 - C 语言编程透视
  2. 堆排序时间复杂度_堆排序算法
  3. 09945 oracle 解决方法_ORACLE rman与RMAN-00054ORA-09945
  4. win10一按右键就闪屏_升级Win10正式版后屏幕一直闪烁正确的解决办法
  5. JWT操作工具类分享
  6. php电商网站开发流程图,php网上购物平台设计+ER图+流程图.doc
  7. 产品经理如何避免被程序员打?
  8. android 练习之路 (三)
  9. Nginx的原理解析
  10. mysql 替换 汉字_MySQL替换文字
  11. GoogleMapAPI
  12. 在Java中用SHA1WithRSA创建的签名如何在.NET中验证
  13. Ubuntu18.04的截图问题
  14. 【我的架构师之路】- golang源码分析之channel的底层实现
  15. R语言结构方程模型(SEM)在生态学领域中的实践应用
  16. 计算机想ping一下网络,电脑的Ping值和网络带宽之间有什么关系?
  17. 情感分析之PMI互信息
  18. SQL select详解(基于选课系统)
  19. Obj文件解析相关bug心得
  20. 几款实用的内网穿透工具

热门文章

  1. arcengine坐标转换[转]
  2. node执行cmd命令方法
  3. 关于前后端分离我的理解
  4. 第十章—DOM(0)—NODE类型
  5. h5实现手机端等级进度条
  6. Android官方技术文档翻译——Gradle 插件用户指南(7)
  7. ubuntu在系统启动logo过后无法进入桌面的处理方法
  8. acm算法模板(1)
  9. 异常:java.util.ConcurrentModificationException
  10. 图像分析:二值图像连通域标记