【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
相关推荐
十五年专注C++开发6 分钟前
QT 中的元对象系统(二):元对象实现原理QMetaObject
开发语言·c++·qt
郑州吴彦祖7728 分钟前
排序算法漫游:从冒泡到堆排的底层逻辑与性能厮杀
java·数据结构·算法·排序算法
m0_7482371516 分钟前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql
2201_7596465617 分钟前
Three.js 引领时代的 三维可视化技术
开发语言·前端·javascript·3d·webgl
清酒伴风(面试准备中......)20 分钟前
MySQL常用命令大全(可复制使用)
java·数据库·mysql·oracle·实习
HH牛码21 分钟前
C#通过接口 继承接口的类 实现约束 对List内数据类型的值进行排序,可直接复制使用
开发语言·c#
北城望戈24 分钟前
工作中遇到的设计模式整理
java·设计模式
编程诗人华仔30 分钟前
若依框架实际国际化前后端统一解决方案
java·vue.js·spring boot·后端·elementui
涛粒子36 分钟前
IO 和NIO有什么区别?
java·开发语言·nio
IIIIIIlllii38 分钟前
java练习(44)
java·开发语言