Java中Integer使用==对比,数据不在-128到127范围内最后结果为false

总所周知使用==判断的是对象所引用的内存地址是否相同

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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值