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