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

今天发现一个很有趣的事情,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这组则没有对象缓存设置。这个也很好理解,因为在某段数值范围内,这两种类型值的数量是无限的,无法进行缓存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值