解決idea默認(rèn)帶的equals和hashcode引起的bug
idea默認(rèn)帶的equals和hashcode引起的bug
最近因規(guī)范需要,統(tǒng)一使用idea,使用的版本為2017.4.
建立一個(gè)實(shí)體類,在添加的時(shí)候,使用idea的快捷鍵自動(dòng)生成了equals和hashcode方法.
選擇2個(gè)屬性進(jìn)行生成


然后往list中添加,結(jié)果一直出現(xiàn)重復(fù)記錄,調(diào)試半天發(fā)現(xiàn)
if(!super.equals(o)) return false;這一句是進(jìn)行引用比較,如果同一個(gè)類,直接返回,導(dǎo)致出現(xiàn)問(wèn)題。
按理說(shuō)我選擇屬性進(jìn)行比對(duì),肯定是不可能是相同引用了,所以2017.3.4分版本的自動(dòng)生成equals和hashcode請(qǐng)慎
正確的應(yīng)該如下

關(guān)于equals和hashcode問(wèn)題
默認(rèn)情況下也就是從超類Object繼承而來(lái)的equals方法與‘=='是完全等價(jià)的,比較的都是對(duì)象的內(nèi)存地址,但我們可以重寫equals方法,使其按照我們的需求的方式進(jìn)行比較,如String類重寫了equals方法,使其比較的是字符的序列,而不再是內(nèi)存地址。
hashcode是用于散列數(shù)據(jù)的快速存取,如利用HashSet/HashMap/Hashtable類來(lái)存儲(chǔ)數(shù)據(jù)時(shí),都是根據(jù)存儲(chǔ)對(duì)象的hashcode值來(lái)進(jìn)行判斷是否相同的。
這樣如果我們對(duì)一個(gè)對(duì)象重寫了euqals,意思是只要對(duì)象的成員變量值都相等那么euqals就等于true,但不重hashcode,那么我們?cè)賜ew一個(gè)新的對(duì)象,當(dāng)原對(duì)象.equals(新對(duì)象)等于true時(shí),兩者的hashcode卻是不一樣的,由此將產(chǎn)生了理解的不一致,如在存儲(chǔ)散列集合時(shí)(如Set類),將會(huì)存儲(chǔ)了兩個(gè)值一樣的對(duì)象。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springcloud項(xiàng)目快速開始起始模板的實(shí)現(xiàn)
本文主要介紹了springcloud項(xiàng)目快速開始起始模板思路的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法
線程池(thread pool)是一種線程使用模式。線程過(guò)多或者頻繁創(chuàng)建和銷毀線程會(huì)帶來(lái)調(diào)度開銷,進(jìn)而影響緩存局部性和整體性能。這篇文章主要介紹了一種類似JAVA線程池的C++線程池實(shí)現(xiàn)方法,需要的朋友可以參考下2019-07-07
springboot 通過(guò)代碼自動(dòng)生成pid的方法
這篇文章主要介紹了springboot 通過(guò)代碼自動(dòng)生成pid的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
mybatis定義sql語(yǔ)句標(biāo)簽之delete標(biāo)簽解析
這篇文章主要介紹了mybatis定義sql語(yǔ)句標(biāo)簽之delete標(biāo)簽解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java中構(gòu)造方法set/get和toString的使用詳解
這篇文章主要介紹了Java中構(gòu)造方法set/get和toString的使用詳解,構(gòu)造函數(shù)的最大作用就是創(chuàng)建對(duì)象時(shí)完成初始化,當(dāng)我們?cè)趎ew一個(gè)對(duì)象并傳入?yún)?shù)的時(shí)候,會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)并完成參數(shù)的初始化,需要的朋友可以參考下2019-07-07
SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot簡(jiǎn)單使用SpringData的jdbc和durid,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

