先说自动拆装箱,以Integer为例
1、装箱(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); }
Integer中维护了一个内部类IntegerCache,IntegerCache中定义了一个final类型的数组,存储了-128到127的所有Integer对象,若待装箱对象的数值刚好在-128到127之间则直接返回,若不存在则new Integer(i);
2、拆箱(Integer.intValue())
public int intValue() { return value; }
返回数值
3、“==”
基本类型==基本类型,直接比较数值;
基本类型==包装类型,包装类型先拆箱,然后两个基本类型比较数值;
包装类型1==包装类型2,比较内存地址,不会拆箱,若都是装箱后且在-128到127之间内才相等;
4、“equals”
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
包装类型1.equals(包装类型2),两个值都拆箱,然后两个基本类型比较数值;
包装类型.equlas(基本类型),包装类型拆箱,基本类型先装箱然后拆箱后比较数值;