关于java中Integer缓存数组的分析

关于java中Integer缓存数组的分析,第1张

今天发现一个很有趣的事情,java中的Integer如果两个变量值大于127,就算值相等,但是比较其对象则不一致。

一、现象分析
1、当Integer值为处于[-128,127]时候,i1和i2,i5和i6这两组对象相同;
2、当Integer值为处于上述取值范围外的时候,i3和i4,i7和i8这两组对象相同;
3、在2的情况下,其对象的值是相等的(equals)。

二、原因分析
Integer是java原生类,我们可以查看其源码进行分析。
1、Integer带有一个缓存存放对象,当数据处于[-128,127],则直接从获取对象,否则新建一个Integer对象。

2、而IntegerCache是一个静态内部类,其缓存cache是一个存放Integer的数组,默认大小为127+128+1=256。

3、如果用户想修改大小,可以调整java.lang.Integer.IntegerCache.high这个指(默认127),在java变量中调整“-XX:AutoBoxCacheMax=”即可。
在idea中,把jvm中的AutoBoxCacheMax值设置为128,运行得到i3==i4的值就为true了。

4、值得注意的是,如果设置JVM里面-XX:AutoBoxCacheMax=的值大于127则按设置的作为higt值,如果小于等于127,则按127来生效。

我们验证,可以设置AutoBoxCacheMax为50,看到运行得到i1==i1的值就为true,证明AutoBoxCacheMax值依旧是127。

三、总结
1、IntegerCache这个缓存机制是把常用的值进行缓存,减少对象创建和销毁对资源的占用。
2、IntegerCache缓存在第一次使用时初始化,而且类对象不被卸载的情况下是不会被GC。
3、这个缓存机制也被其他自动封箱对象所实现,比如:
Byte、Short以及Long,范围也是[-128,127],但是其最大值是写死为127,无法通过修改AutoBoxCacheMax。

Float以及Double这组则没有对象缓存设置。这个也很好理解,因为在某段数值范围内,这两种类型值的数量是无限的,无法进行缓存。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1295047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存