Integer 缓存
在 Java 中,如果你通过 new Integer(value)
显式创建一个 Integer
对象,以下几点需要注意:
内存中的 Integer 对象
-
缓存范围:
Java 自动缓存的
Integer
对象范围是从-128
到127
。这些对象在类加载时被创建并存储在内存中。 -
使用
new
创建对象:当你使用
new Integer(value)
创建一个整数对象时,无论value
的值是-127
、0
、100
还是128
,都会创建一个新的Integer
对象。即使这个值在缓存范围内,new
关键字也不会返回缓存中的对象。
`Integer a = new Integer(100); // 创建新对象
Integer b = new Integer(100); // 又创建一个新对象
System.out.println(a == b); // 输出: false`
-
缓存对象的存在:
缓存的对象在内存中始终存在,直到 JVM 结束。你可以通过
Integer.valueOf(int value)
方法获取缓存对象。
Integer c = Integer.valueOf(100); // 使用缓存
Integer d = Integer.valueOf(100); // 同样使用缓存
System.out.println(c == d); // 输出: true
import java.util.HashMap;
import java.util.Map;
public class IntegerCache {
private static final Map<Integer, Integer> cache = new HashMap<>();
static {
for (int i = -128; i <= 127; i++) {
cache.put(i, i);
}
}
public static Integer valueOf(int value) {
return cache.getOrDefault(value, new Integer(value));
}
public static void main(String[] args) {
Integer a = IntegerCache.valueOf(100);
Integer b = IntegerCache.valueOf(100);
System.out.println(a == b); // 输出: true
Integer x = IntegerCache.valueOf(200);
Integer y = IntegerCache.valueOf(200);
System.out.println(x == y); // 输出: false
}
}
总结
- 使用
new Integer(value)
会创建新对象,而不会使用缓存的对象。 - 缓存的
Integer
对象(-128 到 127)在内存中始终存在,但通过new
创建的对象不会与这些缓存对象相同。 - 若要利用缓存,使用
Integer.valueOf(int)
方法是最佳选择。 - 返回缓存对象:当你调用
Integer.valueOf(int value)
时,该方法会检查传入的值是否在缓存范围内(-128 到 127)。如果是,它会返回缓存中的对象,而不是创建新的对象。
`public static Integer valueOf(int i) {
if (i >= Integer.MIN_VALUE && i <= 127) {
return IntegerCache.cache[i + 128]; // 返回缓存中的对象
}
return new Integer(i); // 超出范围时,创建新对象
}`