总所周知使用==判断的是对象所引用的内存地址是否相同
int属于基本数据类型,可以使用==对值进行判断,而Integer属于int的包装类,在尝试使用这种方式进行判断时却得到了和预想中不一样的结果
Integer num1 = 128;
Integer num2 = 128;
System.out.println(num1 == num2);
//false
Integer num3 = 127;
Integer num4 = 127;
System.out.println(num3 == num4);
//true
当查看相关资料和Integer源码后发现,在Integer中有一个内部私有类IntegerCache,IntegerCache会缓存 -128到127的整数对象,从Integer的valueOf方法中可以看到如果值的范围在 -128到127之间,那么就从IntegerCache中获取,不在范围内则重新new一个
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
官方的解释是通过缓存频繁请求的值来提高空间和时间性能,可以通过-XX:AutoBoxCacheMax=size进行设置,但是只能往大的设置,最小值永远-128
如果要对Integer进行判断可以使用下面的方法:
//1
Objects.equals(num1,num2)
//2
num1.equals(num2)
//3
num1.intValue() == num2.intValue()