Integer类型128==128?false

时间:2024-05-22 20:12:53

Integer 与 int 数值比较?
Integer类型128==128?false
乍一看结果是相等的,都应该为true,其实不然。
1,Integer 和 Integer 1相比较是相等?
2,Integer 和 Integer 127以上 相比较是相等?
答案:
1:true
2:false
Integer类型128==128?false
为什么会这样子?原因是什么?我是不是学了假的Java?
通过查看Integer源代码发现:
Integer类型128==128?false
Integer类型128==128?false
Integer类型128==128?false
Integer类型128==128?false
你会发现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,比较两个对象的值。
Integer类型128==128?false
Integer类型128==128?false
从上面的代码可以看到,不在-128~127之间的数用equals来比较是相同的。

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