回答重点
Java的Integer缓存池(Integer Cache)是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能
在 -128到127范围内的Integer对象会被缓存和复用
原理:
- Java在自动装箱时,对于值范围在-128 - 127之中的int类型,会直接返回一个已经缓存的Integer对象,而不是创建新的对象
缓存池的使用场景:
- **自动装箱(Auto-boxing):**当基本类型int转换为包装类Integer时,若数值在缓存范围内,返回缓存对象,而不是创建新对象
- **值比较:**由于相同范围内的整数使用同一个缓存对象,使用==可以正确比较它们的地址(引用相同),而不需要使用equals()。但是要注意对于超过缓存范围的Integer对象,==比较的是两个不同的对象地址。
扩展知识
缓存池的可配置范围
在Java8及以后的版本中,可以通过JVM参数 -XX:AutoBoxCacheMax=size 来调整缓存池的上限
比如:
java
java -XX:AutoBoxCacheMax=500
这样可以将缓存范围扩展到-128 - 500
缓存池实现原理分析
实现的原理是int在自动装箱的时候会调用Integer.valueOf(),进而用到了IntegerCache。
IntegerCache的底层实现,就是判断下值是否在范围之内,如果是的话去IntegerCache中取
IntegerCache在静态块中会初始化好缓存值
不仅Integer有缓存池,Long也是有的,不过范围是写死的 -128 到 127(无法配置)
- Long、Short、Byte这三种包装类缓存范围也是-128到127的
- Float和Double没有缓存池,因为是小数,能存的数太多了
- Character缓存范围是\u0000到\u007F(即0到127,代表ASCII字符集)
- Boolean只缓存两个值,即true和false