你真的理解 Integer 的缓存问题吗?

2019-11-15 1

  

背景

下面给出一个例子,问输出的结果是多少:

image.png


很多新手可能非常犹豫,有一些经验的同学可以回答出"标准"答案。问原因则随口就说”Integer缓存了-128到127之间的整数对象“,为什么会缓存?还有其他答案?可能就不知道了。what??? 难道这不是标准答案?还想咋地?

分析

运行

想知道答案很容易,直接运行,结果是 true ,false。

源码法

直接看源码, 我们知道声明整数时,会通过 java.lang.Integer#valueOf(int) 构造(不信可以断点)。

image.png


通过源码和注释可以看到 如果是-128到127之间的整数,则会使用整数缓存对象,否则就new一个整形对象。因此第一个是true,第二个是false。

反汇编

前面讲到了,用到了 再问一个问题  为什么调用了   java.lang.Integer#valueOf(int) ?我们直接反汇编:javap-c IntTest

image.png


很明显四个Integer对象的构造使用了java/lang/Integer.valueOf函数。那么除了上面的回答还有哪些更完善的回答呢?我们继续看 java.lang.Integer.IntegerCache的源码

image.png


可以看到可以通过设置虚拟机参数:XX:AutoBoxCacheMax=<size>或 -Djava.lang.Integer.IntegerCache.high=<high>来设置缓存范围的最大值(包含)。因此如果将最大值设置为150或者以上。则程序的答案就是 true, true。另外缓存是 《Java语言规范》的要求,具体可以去语言规范里看。这里提供手册的下载地址:https://docs.oracle.com/javase/specs/index.html

 

image.png

image.png

总结

我们看一些文章的时候,不要止步于文章给出的标准答案,否则总是“背”文章,印象不深刻。最好自己能够动手DEMO一下,能过亲自去源码里看一看,能够有自己的思考,才能学得更多。研究Java相关问题除了多看源码外,还可以多反汇编,不要惧怕,一回生两回熟,慢慢就会乐此不疲。总之希望本文能够给大家一些启发,养成读源码,反汇编等好的学习方法,更快进阶。

 


banner.jpg

公司简介

   中城投丝路核心团队为打造互联网、数字城市优质平台汇聚全球行业精英,孵化创建了福建鹏枫智能科技(关注数字城市细分行业应用,如:交通、水利环保等)、181科技(物联网传感平台),为促进数字文化交流还成立了鑫智会联盟中心(在数字六年经验以上的行业先驱组成的智库)。我们为每一位合作伙伴、更为加入团队的每位人才精英提供更为广阔的施展舞台、职业能力锻炼机遇。

查看更多

联系我们

  •  福州大学城闽江学院
  •  北京市庙城镇293号院2号(总部)
  •  福清市福建师范大学
  •  联系电话:0591-8786-1210
  •  手机:18050166663
  •  3058661698@qq.com
  •  http://www.chinazspeed.com