之前以为equals就是值相等 , == 就是引用相等或者说绝对相等,他大多数情况下是对的,除了重写
今天在项目中遇到这样一个问题:
我将使用ibatis从mysql 数据库中查询返回符合条件的数据列表的size和按照某种条件更新受影响的行数(这里用Long接收)做比较,如果不相等就代表有的明细没有更新成则抛出异常,类似如下:
List<Object> 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真好玩!
网友评论