以int和Integer类型为例。
Integer自动装箱:
Integer a1 = 128;
Integer a2 = 128;
System.out.println(a1 == a2); //false
System.out.println(a1.equals(a2)); //true
Integer b1 = 127;
Integer b2 = 127;
System.out.println(b1 == b2); //true
System.out.println(b1.equals(b2)); //true
在进行自动装箱时,编译器会使用Integer.valueOf()方法。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
如果传入的整数在-128-127之间,返回的是一个缓存池中的值。
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
如果超出该范围,创建的是新的对象实例。
对于equals方法,比较的是Integer对象对应的int值:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
总结一下:
如果通过new Integer(),每次都会创建新的对象;
如果通过Integer.valueOf()或进行自动装箱,当int值在-128~127之间时,“==” 为true,超出该范围创建新对象。
比较Integer类型变量是否相等应该使用equals方法。