先说原因,之所以需要用equals比较包装类的话,是因为包装类里有一个缓存数组,缓存了-128—127的值,然后超过这个范围会去创建新的对象;而==判断包装类的话判断的是对象的内存地址,equals判断包装类是对象的值是否相等,所以相同包装类之间的比较尽量采用equals来判断。
例:Integer包装类内部源码
public static Integer valueOf(int i){
if(i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的一个内部静态类,cache是IntegerCache的静态数组
例:Long包装类内部源码
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
public static Long valueOf(long i){
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}