【BASE】Integer 缓存
在 Java 中,Integer 缓存(Integer Cache)是 Java 为了优化小整数对象的创建和使用而引入的机制。它的核心作用是减少 Integer 对象的创建,提高性能和减少内存消耗。
Integer 缓存机制
- 范围:默认缓存
-128到127之间的整数。 - 原理:对于这个范围内的整数,
Integer.valueOf(int)方法不会新建对象,而是返回缓存池中的对象。 - 触发条件:
- 使用
Integer.valueOf(int)方法创建 Integer 对象时,会复用缓存池对象。 - 自动装箱(Autoboxing)时,实际上调用的是
Integer.valueOf(int),也会使用缓存池。
- 使用
示例代码
public class IntegerCacheTest {
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true,引用相同,来自缓存
Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false,超出缓存范围,创建新对象
}
}
解释:
a == b结果是true,因为127在Integer缓存范围内,a和b指向同一个对象。c == d结果是false,因为128超出了默认缓存范围,Integer.valueOf(128)会创建新的Integer对象。
Integer 缓存的实现
查看 Integer 类的 valueOf(int) 方法:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache.low = -128,IntegerCache.high = 127(默认)。IntegerCache.cache是一个数组,存储-128到127之间的Integer实例。- 如果
i在缓存范围内,直接返回cache数组中的对象,否则新建一个Integer对象。
如何修改缓存范围
可以通过 -XX:AutoBoxCacheMax=<N> JVM 参数调整最大缓存值。例如:
java -XX:AutoBoxCacheMax=200 IntegerCacheTest
这样 Integer.valueOf(200) 也会被缓存。
为什么需要缓存?
- 避免频繁创建小整数对象,减少 GC(垃圾回收)压力。
- 提高整数运算的效率,尤其是在大量使用小整数的场景(如循环、计数、索引)。
注意点
-
new Integer(x)不会使用缓存Integer x = new Integer(127); Integer y = new Integer(127); System.out.println(x == y); // falsenew关键字会创建新对象,不会使用缓存。
-
其他包装类也有类似缓存
Byte、Short、Long、Character(0-127)、Boolean也有类似的缓存。Float和Double没有缓存机制。
总结
Integer默认缓存-128到127的整数。Integer.valueOf(int)复用缓存,new Integer()不使用缓存。- 可以通过
-XX:AutoBoxCacheMax=N调整缓存上限。 - 适用于
Byte、Short、Long、Character(0-127)和Boolean,但Float和Double没有缓存。
这个缓存机制是 Java 提升性能、减少内存消耗的重要优化手段,特别是在数值计算和集合操作中非常有用。
浙公网安备 33010602011771号