public class MyTest2 {
public static void main(String[] args) {
/*Integer 类中一个静态内部类 IntegerCache 他有几个静态常量
static final int low = -128;
static final int high;
static final Integer cache[]; //维护的Integer数组
他有一个静态代码,在静态代码块里面,就会 cache[] 数组赋值
static {
// high value may be configured by property
int h = 127;
high = h;
//定义了数组长度是 256
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
assert IntegerCache.high >= 127;
}
Integer i5 = 128; 自动装箱 调用的 valueOf()
/* public static Integer valueOf(int i) { //127
if (i >= -128 && i <= 127) {
return Integer.IntegerCache.cache[255];
}
return new Integer(i);
}
*/
Integer i3 = new Integer(128); //new Integer(i);
Integer i4 = new Integer(128); //new Integer(i);
System.out.println(i3 == i4); //false
System.out.println(i3.equals(i4)); //true
System.out.println("-----------");
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6); //false
System.out.println(i5.equals(i6)); //true
System.out.println("-----------");
Integer i7 = 127;
Integer i8 = 127;
System.out.println(i7 == i8); //true
System.out.println(i7.equals(i8)); //true
}
/* public static Integer valueOf(int i) { //127
if (i >= -128 && i <= 127) {
return Integer.IntegerCache.cache[255];
}
return new Integer(i);
}*/
}
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6); //false
- 128为整数,而要的是一个Integer的类型,要进行自动装箱
- Integer类中,自动装箱的底层要调用静态的valueOf()方法
- 在静态的valueOf方法中有一个判断,判断输入的整数是否超过int的范围(-127~128)
- 超过范围会创建一个新的Integer对象,并返回,所以当比较的整数超过范围时,返回的是新创建的对象,即 Integer i5 = 128; i5接收的是一个新对象, Integer i6 = 128;i6接收的也是一个新对象,而
==
在引用类型中比较的是两个对象的地址是否相等,则可得出i5==i6的比较结果为false- 若输入的整数没有超过范围,则返回(Integer类中的)静态方法IntegerCache()中的存在于静态代码块中的Integer类型的静态数组cache中的某个值。因为是静态方法而且静态数组cache在静态代码块中,所以在类加载的时候就执行。在静态代码块中,对cache数组进行赋值操作。
也就是说当输入的整数在范围内时会调用一个数组,而且数组的下标是输入的值+1计算出来的,而数组中的值,是在类加载的时候就已经存放好的。
以下是具体源代码:
由以下可知,只有数值型中会出现这种情况