问题:Integer缓存默认的上下限是多少,能改吗?
答:默认范围是[-128,127],下限不能改,上限能改。
public class TestInteger {
public static void main(String[] args) {
int a =3;
int b =3;
Integer c = 3;
Integer d = 3;
Integer e = new Integer(3);
Integer f =Integer.valueOf(3);
Integer g = 128;
Integer h = 128;
System.out.println(a==b);//true
System.out.println(c==d);//true
System.out.println(c==e);//false
System.out.println(c==f);//true
System.out.println(e==f);//false
System.out.println(a==e);//true
System.out.println(a==f);//true
System.out.println(g==h);//false
}
}
1.在[-128,127]范围内,如果值相同,从缓存数组中同位置取出的是同一个对象,所以相等,new出来的对象是一个新对象,有着不同的地址,自然是不同的,和基本类型比较,Integer会拆箱为int类型,然后进行比较。
2.上下限问题:
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) {
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);
}
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() {}
}
从IntegerCache类中可以看到,下限low固定为-128,上限并未固定,初始为127,所以下限不能变,上限可以通过配置运行时参数进行改变:
java -D java.lang.Integer.IntegerCache.high=1000 TestInteger