自动装箱,是把一个 基础类型 比如 int 包装成一个 对象类型Integer,先不讨论这是怎么实现的。
那么,如题的答案是 true 还是 false呢?
看一下 Integer 类,内置了一个 Integer类型的数组。如下,这个数组就是用来完成自动装箱的。
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
当一个int 变量值 在数组中存在,则直接取出来用,否则就new 一个 ingeter对象了。
可以看到,缓存的数组 默认 最大值是127,所以 128 是会重新new新的integer对象。用 == 比较 自然是不相等的。如果是 127 就相等了。
所以,默认情况下,-128 -- 127 之间的数值,用 == 比较是相等的,超出范围就不相等了。
可以用 JVM的参数
-XX:AutoBoxCacheMax=<size>
来扩展 上限。
比如:设置
-XX:AutoBoxCacheMax=128
那么结果就是 true
就是这么简单了。