谈谈Integer中的静态类IntegerCache

简介: 学习的本质就是一个赋值的过程,用新知识来覆盖你的旧知识或者无知(null)。掌握知识是自己的, 分享知识,才能帮助更多的人,创造更大的价值。学贵以恒,以此自勉,与君共享。----曦阳X上次在博客园看到有关IntegerCache的文章,回想起之前一次面试的时候也遇到过这种题,当时知...

        学习的本质就是一个赋值的过程,用新知识来覆盖你的旧知识或者无知(null)。掌握知识是自己的, 分享知识,才能帮助更多的人,创造更大的价值。学贵以恒,以此自勉,与君共享。----曦阳X

上次在博客园看到有关IntegerCache的文章,回想起之前一次面试的时候也遇到过这种题,当时知道有IntegerCache这个东西会缓存-128到127之间的数据,但并没有深入研究下,因此今天再深入分析下这个类,先看看下面一段代码:

Integer int1 = 20;

Integer int2 = 20;

Integer int3 = 128;

Integer int4 = 128;

Integer int5 = new Integer(20);

System.out.println(int1 == int2);

       System.out.println(int3 == int4);

       System.out.println(int1 == int5);

如果不了解Integer内部的缓存机制,可能会对此一脸懵逼:这还有啥好比较的,20和128都是常量,前2个肯定都是true,Integer是对象类,每次new出来的对象都应该在不同的内存中,== 比较连地址都不等,肯定都是false。事实上,如果你真这么想就错了。

其实按照上学时的经验我们也会怀疑:这么简单肯定有问题,出题人这么傻会出个这种题?没错,越是简单的地方往往越容易采坑,今天就来谈谈Integer中的静态类IntegerCache问题。

先说下上面的答案:true,false,false;后面再分析原因。

下面是Integer中的静态类IntegerCache的源码,我们来一点点分析:

       IntegerCache的源码其实很简单,就是定义了一个high和一个low上下限,这2个值就是用于存储Integer的缓存对象,目的也很明确:提高内存理由率和效率,类似的缓存机制还有8种基本数据类型中除了Double和Float外的6种,比如ShortCache,ByteCache等,而之所以Double和Float没有缓存机制,是因为double、float是浮点型的,没有经常使用到的数据,缓存效果没有其它几种类型使用效率高。除了IntegerCache稍复杂,其他都很简单。不得不说,JDK的作者个个都是天才,代码写得由简洁又巧妙,当然好多代码功力不够也不太好看懂。

      还有就是定义了一个Integer类型的Cache数组,目的就是存放缓存的Integer对象。下面看下static静态代码块。     

  static {
// high value may be configured by property
int h = 127;
    //意味着可以通过JVM参数java.lang.Integer.IntegerCache.high来设置缓存的最大值
    String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
    if (integerCacheHighPropValue != null) {
try {
            //如果设置了Cache的最大值,就将该最大值与127比较,取其中较大的一个作为缓存的最大值。意味着假如设置的最大值为100,那其实是不会生效的,这么做估计是为了尽可能利用缓存,达到整体性能较好,当然最大值也不能超过Integer.MAX_VALUE
            int i = parseInt(integerCacheHighPropValue); 
            i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
            //这里得到的h是新建Integer数组的Size,因为low是-128,所以low前面要带个-号,其实就是相加,-1是把0也算上
            h = Math.min(i, Integer.MAX_VALUE - (-low) -1); 
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
//初始化IntegerCache
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
    //私有构造方法
private IntegerCache() {}
} 
通过上面分析,我们知道IntegerCache存的其实默认就是-128到127之间的256个Integer对象,这些对象是存在java常量区的。当执行Integer int1 = 20的时候,编译器会自动进行装箱操作,实际执行了Integer.valueOf(int i)方法,同样的,如果是拆箱操作,执行的就是Integer.intValue()方法,下面来看看valueOf(int i)方法的源码:

      

     这么看就很清晰了,当进行自动装箱的时候,会先判断这个值是否在IntegerCache的low和high之间,如果在,就返回IntegerCache中缓存的Integer对象,再来看看开始的题目:

     20是在-128到127之间,因此不会新建对象,都是IntegerCache中的对象,因此int1和int2相等

     同理:128超过了IntegerCache.high,因此新建了2个不同的对象(存在堆区,在JVM内存中地址不等),所以int3 == int4 为false

     至于int1 和int5,由于int1是存在java常量区,int5是存在java的堆区,因此2者也不相等,故也是false。

  

     结尾:看到这个静态内部类,又想发散下静态内部类的加载时间和机制,以及java中静态导入的问题,下次再来讲讲这2个问题

 

   

 

目录
相关文章
|
并行计算 Linux C语言
PaddleOCR
PaddleOCR
1327 0
|
Java 编译器 Go
Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序
Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序
442 0
|
人工智能
【MCP教程系列】阿里云百炼xChatPPT,5分钟轻松搞定PPT
通过阿里云百炼平台结合ChatPPT,只需简单四步即可快速生成专业PPT。
3076 0
|
6月前
|
监控
抖音快手小红书评论区用户ID采集工具,监控提取评论区UID评论内容,按键精灵插件最牛版
这是一款营销数据监控与采集工具源码,能够实时监控博主营销作品下的用户互动信息,第一时间提取潜在客户的购买意向评论
|
5月前
|
人工智能 安全 数据可视化
安全领航!阿里云AI Stack一体机首批通过国家信通院大模型安全能力认证
在人工智能深度渗透千行百业的当下,阿里云AI Stack一体机首批通过中国信通院《大模型一体机安全能力要求》标准评估,成为国内首批在系统架构上达标的标杆产品,标志着企业级大模型部署迈入安全可信新阶段。
457 0
|
安全 前端开发 测试技术
LP质押模式系统开发技术规则
LP质押模式系统开发结合了DeFi和区块链技术,允许用户将代币质押到流动性池中获取奖励。系统包括需求调研、区块链平台选择(如Ethereum、BSC、Polygon)、智能合约开发、前端界面设计、安全审计及测试、部署上线和持续优化。通过模块化设计和多签名机制,确保系统的高可用性、安全性和可扩展性,为用户提供高效、安全的资产增值途径。
|
JavaScript Java 关系型数据库
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
|
机器学习/深度学习 计算机视觉
智慧教室—基于人脸表情识别的考试防作弊系统
智慧教室—基于人脸表情识别的考试防作弊系统
316 2
|
人工智能 搜索推荐 算法
啥是AI,认识身边的AI
人工智能,或AI,悄然融入我们的日常生活,成为不可或缺的一部分。在智能手机中,语音助手如Siri、小爱同学等,不仅帮我们完成日常操作,还能提供陪伴。AI还化身时尚摄影师,美化我们的照片;通过个性化推荐,在各类应用中呈现我们感兴趣的内容。智能家居中,智能音箱控制家电,安全摄像头守卫家庭,智能冰箱推荐健康食谱。在线上,AI优化购物体验,定制化信息流让我们享受个性化社交。在医疗领域,AI辅助诊断疾病,智能手环监测健康。出行时,AI规划最佳路线,自动驾驶预示未来。教育娱乐方面,AI定制学习计划,创造沉浸式游戏体验。AI已成为我们贴心的生活助手。
|
机器学习/深度学习 传感器 算法
构建未来:基于机器学习的智能健康监测系统
【5月更文挑战第12天】 在数字医疗领域,智能健康监测系统的出现正在革新我们对健康管理和疾病预防的理解。本文将探讨一个基于机器学习技术的智能健康监测系统的设计与实现,它能够实时跟踪个体的健康指标并通过预测性分析提前警示潜在的健康问题。通过融合生物统计学、数据挖掘及模式识别等先进技术,该系统旨在为个人用户提供量身定制的健康建议,并为医疗专业人员提供决策支持。文章首先概述了系统框架和关键技术,随后详细讨论了机器学习模型的建立过程以及如何优化这些模型以提高预测的准确性。最后,我们通过实验结果验证了系统的有效性,并讨论了未来的发展方向。