在Integer的valueOf()方中,当数值在-128-127之间时,数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。
1.自动装箱
Java 5引入了自动装箱和拆箱机制,允许将基本数据类型自动转换为对应的包装类对象,反之亦然。例如,Integer a = 128;实际上会调用Integer.valueOf(128)方法。
Integer.valueOf()方法
Integer.valueOf(int i)方法的源码如下:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) //会返回一个cache数组return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);
}
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); //保证了i最小是127h = Math.min(i, Integer.MAX_VALUE - (-low) - 1);//后面的maxvalue非常大,h一般情况就是i } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; //high = icache = new Integer[(high - low) + 1];//由于high = i,i最小是127,按照最小的127算,得到256长的数组。//如果i更大,会创建更大的数组 int j = low; for(int k = 0; k < cache.length; k++) //j就是-128,-128到127 256个数在cache数组从0到256依次被赋值cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; }
}
-128到127由于是热点数据,所以缓存了起来
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}Integer的equals也是根据值来是不是true,不是单纯的==了