解決idea默認帶的equals和hashcode引起的bug
idea默認帶的equals和hashcode引起的bug
最近因規范需要,統一使用idea,使用的版本為2017.4.
建立一個實體類,在添加的時候,使用idea的快捷鍵自動生成瞭equals和hashcode方法.
選擇2個屬性進行生成
然後往list中添加,結果一直出現重復記錄,調試半天發現
if(!super.equals(o)) return false;這一句是進行引用比較,如果同一個類,直接返回,導致出現問題。
按理說我選擇屬性進行比對,肯定是不可能是相同引用瞭,所以2017.3.4分版本的自動生成equals和hashcode請慎
正確的應該如下
關於equals和hashcode問題
默認情況下也就是從超類Object繼承而來的equals方法與‘==’是完全等價的,比較的都是對象的內存地址,但我們可以重寫equals方法,使其按照我們的需求的方式進行比較,如String類重寫瞭equals方法,使其比較的是字符的序列,而不再是內存地址。
hashcode是用於散列數據的快速存取,如利用HashSet/HashMap/Hashtable類來存儲數據時,都是根據存儲對象的hashcode值來進行判斷是否相同的。
這樣如果我們對一個對象重寫瞭euqals,意思是隻要對象的成員變量值都相等那麼euqals就等於true,但不重hashcode,那麼我們再new一個新的對象,當原對象.equals(新對象)等於true時,兩者的hashcode卻是不一樣的,由此將產生瞭理解的不一致,如在存儲散列集合時(如Set類),將會存儲瞭兩個值一樣的對象。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java基礎之淺談hashCode()和equals()
- Java 中 hashCode() 與 equals() 的關系(面試)
- Java集合框架之Map詳解
- Java在重載中使用Object的問題
- 搞懂JAVAObject中的hashCode()