Integer类型128==128?false

Integer 与 int 数值比较?
在这里插入图片描述
乍一看结果是相等的,都应该为true,其实不然。
1,Integer 和 Integer 1相比较是相等?
2,Integer 和 Integer 127以上 相比较是相等?
答案:
1:true
2:false
在这里插入图片描述
为什么会这样子?原因是什么?我是不是学了假的Java?
通过查看Integer源代码发现:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你会发现Integer类内部 通过静态内部类提供了一个缓存池,范围在-128~127之间,如果超过这个范围 Integer 值都是new出来的新对象,比较的话肯定会出错!
而重新new Integer(num),这样的话,用==比较返回都是false,因为它们引用的堆地址不样。
也就是说:
Integer -128~127实际上你可以看成是整形int,所以第一个的输出结果是一true
但是128以上的数值就不能看成int了,它是对象,两个值相同的不同的对象如果用= =判断肯定是不相等的。

这时就有个疑问了?为什么这么写Integer源码?
原因是:Integer缓存了-128~127之间的数,这是在类加载期间就完成的。以后需要的时候直接指向它就可以了,省去了构造对象的开支,提高了效率。

那么我们该怎么比较不在-128~127之间的数据呢,可以使用equals判断,integer的equals方法重写了object里的equals,调用了intValue,比较两个对象的值。
在这里插入图片描述
在这里插入图片描述
从上面的代码可以看到,不在-128~127之间的数用equals来比较是相同的。

java中还有与Integer类似的是Long,它也有一个缓存,在区间[-128,127]范围内获取缓存的值,而Long与long比较的时候先转换成long类型再做值的比较。
在这里插入图片描述
总的一句话Integer比较大小,看赋的值是否在-128到127之间,如果不在这个区间则会new Integer(num),变成一个新的对象,用= =比较的时候内存地址就不一样了,返回false, 反之为true。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值