解決idea默認帶的equals和hashcode引起的bug
idea默認帶的equals和hashcode引起的bug
最近因規(guī)范需要,統(tǒng)一使用idea,使用的版本為2017.4.
建立一個實體類,在添加的時候,使用idea的快捷鍵自動生成了equals和hashcode方法.
選擇2個屬性進行生成
然后往list中添加,結(jié)果一直出現(xiàn)重復(fù)記錄,調(diào)試半天發(fā)現(xiàn)
if(!super.equals(o)) return false;這一句是進行引用比較,如果同一個類,直接返回,導(dǎo)致出現(xiàn)問題。
按理說我選擇屬性進行比對,肯定是不可能是相同引用了,所以2017.3.4分版本的自動生成equals和hashcode請慎
正確的應(yīng)該如下
關(guān)于equals和hashcode問題
默認情況下也就是從超類Object繼承而來的equals方法與‘=='是完全等價的,比較的都是對象的內(nèi)存地址,但我們可以重寫equals方法,使其按照我們的需求的方式進行比較,如String類重寫了equals方法,使其比較的是字符的序列,而不再是內(nèi)存地址。
hashcode是用于散列數(shù)據(jù)的快速存取,如利用HashSet/HashMap/Hashtable類來存儲數(shù)據(jù)時,都是根據(jù)存儲對象的hashcode值來進行判斷是否相同的。
這樣如果我們對一個對象重寫了euqals,意思是只要對象的成員變量值都相等那么euqals就等于true,但不重hashcode,那么我們再new一個新的對象,當原對象.equals(新對象)等于true時,兩者的hashcode卻是不一樣的,由此將產(chǎn)生了理解的不一致,如在存儲散列集合時(如Set類),將會存儲了兩個值一樣的對象。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud項目快速開始起始模板的實現(xiàn)
本文主要介紹了springcloud項目快速開始起始模板思路的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Java中構(gòu)造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對象時完成初始化,當我們在new一個對象并傳入?yún)?shù)的時候,會自動調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07SpringBoot簡單使用SpringData的jdbc和durid
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著SpringBoot簡單使用SpringData的jdbc和durid,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06