【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
相关推荐
HoneyMoose4 分钟前
Discourse 更加依赖 tag 的扁平化管理
开发语言
Hello eveybody9 分钟前
介绍最大公因数和最小公约数(Python)
开发语言·python
谭欣辰10 分钟前
C++ 堆 的基础与 二叉堆详解
开发语言·c++
西海天际蔚蓝13 分钟前
用AI写的一个包含web和小程序的个人简历
java
Ulyanov14 分钟前
《PySide6 GUI开发指南:QML核心与实践》 第十篇:综合实战——构建完整的跨平台个人管理应用
开发语言·python·qt·ui·交互·qml·雷达电子战系统仿真
ian4u16 分钟前
车载 Android C++ 完整技能路线:从基础到进阶
android·开发语言·c++
lly20240616 分钟前
JSP 过滤器
开发语言
郝学胜-神的一滴17 分钟前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
aq553560018 分钟前
数字资源分发的技术革命与未来趋势
java·开发语言·python·php
AI玫瑰助手20 分钟前
Python基础:元组的定义与不可变特性(对比列表)
开发语言·python·信息可视化