ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

关于java中Integer缓存数组的分析 今天发现一个很有趣的事情java中的Integer如果两个变量值大于127就算值相等但是比较其对象则不一致。一、现象分析1、当Integer值为处于[-128127]时候i1和i2,i5和i6这两组对象相同2、当Integer值为处于上述取值范围外的时候i3和i4,i7和i8这两组对象相同3、在2的情况下其对象的值是相等的(equals)。二、原因分析Integer是java原生类我们可以查看其源码进行分析。1、Integer带有一个缓存存放对象当数据处于[-128127]则直接从获取对象否则新建一个Integer对象。2、而IntegerCache是一个静态内部类其缓存cache是一个存放Integer的数组默认大小为1271281256。3、如果用户想修改大小可以调整java.lang.Integer.IntegerCache.high这个指默认127在java变量中调整“-XX:AutoBoxCacheMax”即可。在idea中把jvm中的AutoBoxCacheMax值设置为128运行得到i3i4的值就为true了。4、值得注意的是如果设置JVM里面-XX:AutoBoxCacheMax的值大于127则按设置的作为higt值如果小于等于127则按127来生效。我们验证可以设置AutoBoxCacheMax为50看到运行得到i1i1的值就为true证明AutoBoxCacheMax值依旧是127。三、总结1、IntegerCache这个缓存机制是把常用的值进行缓存减少对象创建和销毁对资源的占用。2、IntegerCache缓存在第一次使用时初始化而且类对象不被卸载的情况下是不会被GC。3、这个缓存机制也被其他自动封箱对象所实现比如Byte、Short以及Long范围也是[-128,127],但是其最大值是写死为127无法通过修改AutoBoxCacheMax。Float以及Double这组则没有对象缓存设置。这个也很好理解因为在某段数值范围内这两种类型值的数量是无限的无法进行缓存。
返回列表