之前以為equals就是值相等 , == 就是引用相等或者說絕對相等,他大多數(shù)情況下是對的盟猖,除了重寫
今天在項目中遇到這樣一個問題:
我將使用ibatis從mysql 數(shù)據(jù)庫中查詢返回符合條件的數(shù)據(jù)列表的size和按照某種條件更新受影響的行數(shù)(這里用Long接收)做比較,如果不相等就代表有的明細沒有更新成則拋出異常值依,類似如下:
List<Object> objects=xxxDao.find();
Long count=xxxDao.updateXX(xx);
if(!count.equals(object.size())){
throw new RuntimeException("xxx操作失數浮!");
}
頁面操作時一直失敗,觀察log风秤,返回符合條件的記錄數(shù)是1,update受影響的行數(shù)也是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 的結(jié)果是什么?
答案是:true
反編譯獲得代碼為:
?Long.valueOf(1L) == 1L
然后真正執(zhí)行比較時jvm會對一側(cè)是基本類型无虚,一側(cè)是包裝類型的==比較進行自動拆箱,直接比較值友题,所以上面是true
--其實Integer的也類似 戴质,至于緩存什么的,這里就不講了置森。
今天還有一個發(fā)現(xiàn)就是int的值的寫法還有一個有意思的語法糖:int? tempInt=1_000; int還可以這么賦值,Java真好玩凫海!