1、测试类:
public class IntegerTest {
public static void main(String[] args) {
Integer m = 200;
Integer n = 200;
System.out.println(m == n);
Integer i = 100;
Integer j = 100;
System.out.println(i == j);
}
}
打印信息:
--------------------------------------------------------------------------------
false
true
--------------------------------------------------------------------------------
2、反编译该类:
public class Integertest
{
public static void main(String[] paramArrayOfString)
{
Integer localInteger1 = Integer.valueOf(200);
Integer localInteger2 = Integer.valueOf(200);
System.out.println(localInteger1 == localInteger2);
Integer localInteger3 = Integer.valueOf(100);
Integer localInteger4 = Integer.valueOf(100);
System.out.println(localInteger3 == localInteger4);
}
}
3、查看Integer.valueOf()源码:
public static Integer valueOf(int i) {
//当值大于等于-128 小于等于IntegerCache.high值时,直接在cache数组中取值 否则new一个
if (i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
private static class IntegerCache {
//缓存数上限
static final int high;
//存放缓存数的数组
static final Integer cache[];
static {
//缓存数 下限
final int low = -128;
//默认缓存数 上限
int h = 127;
//integerCacheHighPropValue值在jvm启动初始化是得到 可通过-XX:AutoBoxCacheMax=值 配置该值
if (integerCacheHighPropValue != null) {
int i = Long.decode(integerCacheHighPropValue).intValue();
i = Math.max(i, 127);
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h;
//新建一个大小为(high-low)+1的缓存数组cache
cache = new Integer[(high - low) + 1];
int j = low;
for (int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {
}
}
4、总结:
1)、Integer自动装箱是通过Integer.valueOf(int i)来实现的
2)、如果虚拟机AutoBoxCacheMax没有配置,当i值<=127且>=-128时,Integer.valueOf()会直接去缓存数组中取出相应的Integer对象,其他值均使用构造方法来生成Integer对象。
3)、所以最后的打印结果是 false、true