public class Client {
public static void main(String[] args) {
int num1=127;
int num2=255;
int num3=580;
int num[]={num1,num2,num3};
for(int n:num){
Integer i=new Integer(n);
Integer j=new Integer(n);
//new 产生的对象
System.out.println(i==j);
i=n;
j=n;
//基本类型转换成包装类型后
System.out.println(i==j);
i=Integer.valueOf(n);
j=Integer.valueOf(n);
//通过Integer的静态方法生成
System.out.println(i==j);
}
}
}
输出:false
truetrue
false
false
false
false
false
false
解释:
(1)new产生的Integer对象
new产生的对象地址不相等,所以false
(2)装箱生成的对象
装箱动作是通过valueOf()实现的,所以后两个是一样的。下边是valueOf(int i)的源码:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
其中IntegerCache.high=127
也就说-128到127之间的数缓存了,即-128到127之间的数字直接从整形池中获得对象,其他的直接new。
private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low = -128;
// high value may be configured by property
int h = 127;
if (integerCacheHighPropValue != null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
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() {}
}