先说自动拆装箱,以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(基本类型),包装类型拆箱,基本类型先装箱然后拆箱后比较数值;
本文详细解析了Java中的自动拆装箱机制,包括Integer类的装箱和拆箱过程,以及“==”和“equals”方法在比较包装类型时的行为特点。深入探讨了在-128至127范围内Integer对象的缓存复用机制。
1457





