【Java基础面试题025】什么是Java的Integer缓存池?

回答重点

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
相关推荐
Ray Liang22 分钟前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解38 分钟前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing5 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean5 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven976 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55115 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河16 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程18 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅20 小时前
Java面向对象入门(类与对象,新手秒懂)
java