Integer常量池
Integer包装类有默认缓存池,范围是【 -128~127】 。
其他基本数据类型的包装类都有这个缓存池,包括:Byte,Short,Long。
public static Integer valueOf(int i) {
// 大小为256的缓存池,超出范围就新建对象,否则取出池中常量
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
/**
* A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
*/
private static final Integer[] SMALL_VALUES = new Integer[256];
static {
for (int i = -128; i < 128; i++) {
// 放入对象,方便存取加上偏移
SMALL_VALUES[i + 128] = new Integer(i);
}
}
实例:
int a = 10;
Integer b = 10;
Integer bb = 10;
Integer c = new Integer(10);
Integer cc = new Integer(10);
Integer d = Integer.valueOf("127");
Integer e = Integer.valueOf(127);
Integer ee = Integer.valueOf(127);
Integer f = Integer.valueOf(128);
Integer ff = Integer.valueOf(128);
System.out.println( a==b);// true:int和Integer会自动转型比较int数值
System.out.println(b==bb);// true:虽然是引用,但是都是从Integer默认缓存池取出【-128~127】
System.out.println(b==c);// false:栈中常量和堆中对象
System.out.println(c==cc);// false:不同对象地址不同
System.out.println(b.equals(c));// true:值相同
System.out.println(d==e);// true:Integer.valueOf取出缓存池的对象
System.out.println(e == ee);// true:默认缓存池
System.out.println(f==ff);// false:常量池范围是-128~127,128超出常量池范围