你可能不知道的Java的Long的equals方法的秘密

之前以为equals就是值相等 , == 就是引用相等或者说绝对相等,他大多数情况下是对的,除了重写

今天在项目中遇到这样一个问题:

我将使用ibatis从mysql 数据库中查询返回符合条件的数据列表的size和按照某种条件更新受影响的行数(这里用Long接收)做比较,如果不相等就代表有的明细没有更新成则抛出异常,类似如下:

List objects=xxxDao.find();

Long count=xxxDao.updateXX(xx);

if(!count.equals(object.size())){

throw new RuntimeException("xxx操作失败!");

}

页面操作时一直失败,观察log,返回符合条件的记录数是1,update受影响的行数也是1,可是这里为什么就不相等呢,后来仔细看了一下Long的equals方法才恍然大悟:

public boolean equals(Object obj) {

if (objinstanceof Long) {

return value == ((Long)obj).longValue();

    }

return false;

}

一目了然!Long的equals先对要与之比较的对象进行了类型匹配,如果不是Long的实例,直接就返回false了。



然后又趁热研究了一下Long.valueOf(1)==1 的结果是什么?

答案是:true

反编译获得代码为:

 Long.valueOf(1L) == 1L

然后真正执行比较时jvm会对一侧是基本类型,一侧是包装类型的==比较进行自动拆箱,直接比较值,所以上面是true

--其实Integer的也类似 ,至于缓存什么的,这里就不讲了。

今天还有一个发现就是int的值的写法还有一个有意思的语法糖:int  tempInt=1_000; int还可以这么赋值,Java真好玩!

你可能感兴趣的:(你可能不知道的Java的Long的equals方法的秘密)