您好,登录后才能下订单哦!
# Java中的Integer缓存池怎么使用
## 一、Integer缓存池概述
在Java中,`Integer`类有一个内置的缓存机制,称为**Integer缓存池**。这个特性从Java 5开始引入,目的是为了节省内存和提高性能,通过缓存常用的整数值来减少对象的创建。
### 1.1 缓存范围
默认情况下,Integer缓存池会缓存**-128到127**之间的整数(可通过JVM参数调整)。当通过`Integer.valueOf()`方法或自动装箱(Autoboxing)创建这个范围内的整数时,会直接返回缓存池中的对象,而不是新建实例。
```java
Integer a = 127; // 自动装箱,使用缓存
Integer b = 127; // 复用缓存
System.out.println(a == b); // true(同一对象)
Integer c = 128; // 超出缓存范围
Integer d = 128;
System.out.println(c == d); // false(新建对象)
在Integer
类的源码中,缓存池通过一个静态内部类IntegerCache
实现:
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
int h = 127;
// 可通过JVM参数调整上限
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
h = Math.max(127, Integer.parseInt(integerCacheHighPropValue));
} catch (NumberFormatException ignored) {}
}
high = h;
cache = new Integer[(high - low) + 1];
for (int k = 0; k < cache.length; k++)
cache[k] = new Integer(low + k);
}
}
当调用Integer.valueOf(int i)
时,会优先从缓存池中获取对象:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Java的自动装箱机制(如直接赋值Integer i = 100
)底层调用的是valueOf()
方法,因此会利用缓存:
Integer x = 100; // 等价于 Integer.valueOf(100)
Integer y = 100;
System.out.println(x == y); // true
推荐通过Integer.valueOf()
创建对象而非new Integer()
:
// 推荐方式(可能使用缓存)
Integer a = Integer.valueOf(50);
// 不推荐方式(始终新建对象)
Integer b = new Integer(50);
通过JVM参数可以扩展缓存上限(例如设置为200):
java -Djava.lang.Integer.IntegerCache.high=200 MyApp
由于缓存的存在,==
比较在缓存范围内可能返回true,但超出范围会返回false。建议始终使用equals()
比较值:
Integer m = 200;
Integer n = 200;
System.out.println(m == n); // false(超出默认缓存)
System.out.println(m.equals(n)); // true
缓存池能减少对象创建的开销,但仅对小范围整数有效。对于频繁操作的大整数,仍需注意内存占用。
类似机制也存在于其他包装类中:
- Byte
: 缓存全部值(-128~127)
- Short
: 缓存-128~127
- Long
: 缓存-128~127
- Character
: 缓存0~127
例如在循环中反复使用的中间值:
for (Integer i = 0; i < 100; i++) {
// i在0~127范围内会复用缓存对象
}
在需要大量使用小整数的场景(如状态码、枚举值),利用缓存可降低GC压力。
Integer缓存池是Java优化内存和性能的重要机制,理解其工作原理能帮助开发者: 1. 避免不必要的对象创建 2. 正确比较包装类对象 3. 在特定场景下通过JVM参数调优
关键点记忆:
- 默认缓存范围:-128~127
- 使用valueOf()
而非构造函数
- 比较时优先用equals()
- 可通过JVM参数-Djava.lang.Integer.IntegerCache.high
调整上限 “`
(注:实际字数约900字,可根据需要补充更多代码示例或性能对比数据扩展至1000字。)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。