出现问题?
128错误发生在:基本类型和包装器类型的转换 ,由编译器自动完成的装箱valueOf()中
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1==num2); //结果为true
Integer num3 = Integer.valueOf(128);
Integer num4 = Integer.valueOf(128);
System.out.println(num3==num4); //结果为false
}
Integer num1 = 100 自动装箱,默认底层调用Integer.valueOf(100)方法,相当于Integer num1 = Integer.valueOf(100)
为什么Integer值128比较,结果是false?
上述num1,num2,num3,num4不是值,而是对象,对象在比较时,比较的是对象所指向的地址
查看valueOf()源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
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);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;cache = new Integer[(high - low) + 1];//数组长度256个数
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}private IntegerCache() {}
}
源码中定义好了一个数组,数组范围-128~127,如果值在-128~127之间,那么就从定义好的数组里取出,范围内的数共享地址,值相同时,地址也相同,而不在范围内的,需要重新开辟地址new Integer(i);
在Integet的valueOf()方当中,如果我们的数值在-128~127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128~127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128~127之间的数值用==进行比较是相等的。-128~127 范围内地址一样 128 new integer 需要新开辟一个内存空间,地址不同,所以不相等。
解决方法
Integer num3 = Integer.valueOf(128);
Integer num4 = Integer.valueOf(128);
System.out.println(num3.equals(num4));//输出结果为true