编辑
2023-06-02
学习记录
00
请注意,本文编写于 670 天前,最后修改于 625 天前,其中某些信息可能已经过时。

目录

前提
验证

前提

在项目中发现了一个bug,两个相等的Long类型使用了==来判断是否相等,但是每次都直接跳过了if,也就是说他们是不相等的。

验证

1 .直接声明的 不管是Long 还是long -128 -127 之间使用 == 和 equlas 都是true 因为 Long包对 常用的做了缓存。如果在这个区间直接从cache 中取。所以 == 地址值也是一样的 为true

2 new 出来的 必须使用equals .虽然做了-128 -127 做了缓存,但是new出来的是新分配的内存,地址值不一样 使用== 数值即使一样也为false.

3 使用 == 不管是直接声明的,还是new出来的 ,只要一边有基本数据类型 都可以正常对比。会自动拆箱。例如:

因为下面 int和long 属于基本类型。所以 == 会将Long 拆箱成long 直接比较数值

Long e = 300L; int f = 300; Long g = 300L; long h = 300L; System.out.println("Long与int 300 equals 结果" + (e == f));//true System.out.println("Long与long 300L equals 结果" + (g == h));//true

测试代码

java
public static void main(String[] args) { DemoLong demoLong=new DemoLong(); demoLong.setA(100L); demoLong.setB(11237L); DemoLongTwo demoLongTwo=new DemoLongTwo(); demoLongTwo.setAa(100L); demoLongTwo.setBb(11237L); System.out.println(demoLong.getA()== demoLongTwo.getAa()); System.out.println(demoLong.getB()== demoLongTwo.getBb()); System.out.println(demoLong.getA().equals( demoLongTwo.getAa())); System.out.println(demoLong.getB().equals(demoLongTwo.getBb()) ); }

结果 image.png

Long 类型的缓存源码

java
public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache return LongCache.cache[(int)l + offset]; } return new Long(l); }
java
private static class LongCache { private LongCache(){} static final Long cache[] = new Long[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Long(i - 128); } }

本文作者:Weee

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!