中Integer class
,有private static class IntegerCache
。
这个类有什么用?
使用时有什么好处Integer
?
缓存 -128 和 127 之间的值以供重用。这是享元模式的一个例子,它通过重用不可变对象来最小化内存使用。
除了优化之外,此行为也是 JLS 的一部分,因此可以依赖以下内容:
Integer a = 1;
Integer b = 1;
Integer c = 999;
Integer d = 999;
System.out.println(a == b); // true
System.out.println(c == d); // false
IntegerCache 缓存 -128 到 +127 之间的值以优化自动装箱。
您可以将上限设置为大于127
使用-XX:AutoBoxCacheMax=NEWVALUE
或-Djava.lang.Integer.IntegerCache.high=NEWVALUE
看看它的实现:
private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low = -128;
int h = 127;
if (integerCacheHighPropValue != null) {
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
缓存 256 个值以供再次使用,它们将在您创建第一个Integer
对象时加载。
因此,当您使用==
运算符检查Integer
[-127,128] 范围内两个 s 的相等性时,您会得到它,就好像您在比较两个int
s 时一样。但是,如果您使用 比较Integer
超出此范围的两个 s ==
,您将得到false
,即使它们具有相同的值。