為什麼重寫equals時必須重寫hashCode方法

2022-03-25 13:40:07 字數 4939 閱讀 1845

1樓:地瓜說機

如果你過載了equals,比如說是基於物件的內容實現的,而保留hashcode的實現不變,那麼很可能某兩個物件明明是「相等」,而hashcode卻不一樣。

這樣,當你用其中的乙個作為鍵儲存到hashmap、hasotable或hashset中,再以「相等的」找另乙個作為鍵值去查詢他們的時候,則根本找不到。

使用hashmap,如果key是自定義的類,就必須重寫hashcode()和equals()。

而對於每乙個物件,通過其hashcode()方法可為其生成乙個整形值(雜湊碼),該整型值被處理後,將會作為陣列下標,存放該物件所對應的entry(存放該物件及其對應值)。 equals()方法則是在hashmap中插入值或查詢時會使用到。當hashmap中插入值或查詢值對應的雜湊碼與陣列中的雜湊碼相等時,則會通過equals方法比較key值是否相等,所以想以自建物件作為hashmap的key,必須重寫該物件繼承object的hashcode和equals方法。

2.本來不就有hashcode()和equals()了麼?幹嘛要重寫,直接用原來的不行麼?

hashmap中,如果要比較key是否相等,要同時使用這兩個函式!因為自定義的類的hashcode()方法繼承於object類,其hashcode碼為預設的記憶體位址,這樣即便有相同含義的兩個物件,比較也是不相等的,例如,生成了兩個「羊」物件,正常理解這兩個物件應該是相等的,但如果你不重寫 hashcode()方法的話,比較是不相等的!

hashmap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認為他們是相等的。若equals()不相等則認為他們不相等。如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否為同一物件(即進行記憶體位址的比較),所以必定要兩個方法一起重寫。

hashmap用來判斷key是否相等的方法,其實是呼叫了hashset判斷加入元素是否相等。

引用別人說的一段話哈~

一般來說,如果你要把乙個類的物件放入容器中,那麼通常要為其重寫equals()方法,讓他們比較位址值而不是內容值。特別地,如果要把你的類的物件放入雜湊中,那麼還要重寫hashcode()方法;要放到有序容器中,還要重寫compareto()方法。

equals()相等的兩個物件,hashcode()一定相等;

equals()不相等的兩個物件,卻並不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個物件,hashcode()有可能相等。(我的理解是由於雜湊碼在生成的時候產生衝突造成的)。

反過來:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等

我的理解哈,

2樓:七八三十六

我認為首先要認清equals方法和hashcode方法是用來幹嘛的,然後這兩個之間什麼關係就夠了為什麼重寫equals()就一定要重寫hashcode()方

為什麼重寫equals方法,一定要重寫hashcode方法?

3樓:余哥大百科

過載了equals,比如說是基於物件的內容實現的,而保留hashcode的實現不變,那麼很可能某兩個物件明明是「相等」,而hashcode卻不一樣。

這樣,當你用其中的乙個作為鍵儲存到hashmap、hasotable或hashset中,再以「相等的」找另乙個作為鍵值去查詢他們的時候,則根本找不到。

使用hashmap,如果key是自定義的類,就必須重寫hashcode()和equals()。

而對於每乙個物件,通過其hashcode()方法可為其生成乙個整形值(雜湊碼),該整型值被處理後,將會作為陣列下標,存放該物件所對應的entry(存放該物件及其對應值)。 equals()方法則是在hashmap中插入值或查詢時會使用到。當hashmap中插入值或查詢值對應的雜湊碼與陣列中的雜湊碼相等時,則會通過equals方法比較key值是否相等,所以想以自建物件作為hashmap的key,必須重寫該物件繼承object的hashcode和equals方法。

2.本來不就有hashcode()和equals()了麼?幹嘛要重寫,直接用原來的不行麼?

hashmap中,如果要比較key是否相等,要同時使用這兩個函式!因為自定義的類的hashcode()方法繼承於object類,其hashcode碼為預設的記憶體位址,這樣即便有相同含義的兩個物件,比較也是不相等的,例如,生成了兩個「羊」物件,正常理解這兩個物件應該是相等的,但如果你不重寫 hashcode()方法的話,比較是不相等的!

hashmap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認為他們是相等的。若equals()不相等則認為他們不相等。如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否為同一物件(即進行記憶體位址的比較),所以必定要兩個方法一起重寫。

hashmap用來判斷key是否相等的方法,其實是呼叫了hashset判斷加入元素是否相等。

引用別人說的一段話哈~

一般來說,如果你要把乙個類的物件放入容器中,那麼通常要為其重寫equals()方法,讓他們比較位址值而不是內容值。特別地,如果要把你的類的物件放入雜湊中,那麼還要重寫hashcode()方法;要放到有序容器中,還要重寫compareto()方法。

equals()相等的兩個物件,hashcode()一定相等;

equals()不相等的兩個物件,卻並不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個物件,hashcode()有可能相等。(我的理解是由於雜湊碼在生成的時候產生衝突造成的)。

反過來:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等

4樓:殤洛

如果你過載了equals,比如說是基於物件的內容實現的,而保留hashcode的實現不變,那麼很可能某兩個物件明明是「相等」,而hashcode卻不一樣。

這樣,當你用其中的乙個作為鍵儲存到hashmap、hasotable或hashset中,再以「相等的」找另乙個作為鍵值去查詢他們的時候,則根本找不到。

使用hashmap,如果key是自定義的類,就必須重寫hashcode()和equals()。

而對於每乙個物件,通過其hashcode()方法可為其生成乙個整形值(雜湊碼),該整型值被處理後,將會作為陣列下標,存放該物件所對應的entry(存放該物件及其對應值)。 equals()方法則是在hashmap中插入值或查詢時會使用到。當hashmap中插入值或查詢值對應的雜湊碼與陣列中的雜湊碼相等時,則會通過equals方法比較key值是否相等,所以想以自建物件作為hashmap的key,必須重寫該物件繼承object的hashcode和equals方法。

2.本來不就有hashcode()和equals()了麼?幹嘛要重寫,直接用原來的不行麼?

hashmap中,如果要比較key是否相等,要同時使用這兩個函式!因為自定義的類的hashcode()方法繼承於object類,其hashcode碼為預設的記憶體位址,這樣即便有相同含義的兩個物件,比較也是不相等的,例如,生成了兩個「羊」物件,正常理解這兩個物件應該是相等的,但如果你不重寫 hashcode()方法的話,比較是不相等的!

hashmap中的比較key是這樣的,先求出key的hashcode(),比較其值是否相等,若相等再比較equals(),若相等則認為他們是相等的。若equals()不相等則認為他們不相等。如果只重寫hashcode()不重寫equals()方法,當比較equals()時只是看他們是否為同一物件(即進行記憶體位址的比較),所以必定要兩個方法一起重寫。

hashmap用來判斷key是否相等的方法,其實是呼叫了hashset判斷加入元素是否相等。

引用別人說的一段話哈~

一般來說,如果你要把乙個類的物件放入容器中,那麼通常要為其重寫equals()方法,讓他們比較位址值而不是內容值。特別地,如果要把你的類的物件放入雜湊中,那麼還要重寫hashcode()方法;要放到有序容器中,還要重寫compareto()方法。

equals()相等的兩個物件,hashcode()一定相等;

equals()不相等的兩個物件,卻並不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個物件,hashcode()有可能相等。(我的理解是由於雜湊碼在生成的時候產生衝突造成的)。

反過來:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等

我的理解哈,

5樓:七八三十六

自己的整理,共同學習為什麼重寫equals()就一定要重寫hashcode()方

為什麼在重寫了equals()方法之後也必須重寫hashcode()方法

j**a中重寫equals方法為什麼要重寫hashcode方法說明

6樓:七八三十六

我認為首先要認清equals方法和hashcode方法是用來幹嘛的,然後這兩個之間什麼關係就夠了為什麼重寫equals()就一定要重寫hashcode()方

j**a中重寫equals方法為什麼要重寫hashcode方法說明

7樓:優質內容提供者

1、重寫equals方法時需要重寫hashcode方法,主要是針對map、set等集合型別的使用;

a: map、set等集合型別存放的物件必須是唯一的;

b: 集合類判斷兩個物件是否相等,是先判斷equals是否相等,如果equals返回true,還要再判斷hashcode返回值是否ture,只有兩者都返回ture,才認為該兩個物件是相等的。

2、由於object的hashcode返回的是物件的hash值,所以即使equals返回true,集合也可能判定兩個物件不等,所以必須重寫hashcode方法,以保證當equals返回true時,hashcode也返回ture,這樣才能使得集合中存放的物件唯一。

公民為什麼要依法納稅,公民必須依法納稅的重要性是什麼?

我國社會主義稅收取之於民,用之於民.在我國,國家利益 集體利益 個人利益在根本上是一致的.國家的興旺發達 繁榮富強與每個公民息息相關 而國家職能的實現,必須以社會各界繳納的稅收為物質基礎.因而,在我國每個公民都應自覺納稅.每個公民都應該具有主人翁意識,依法納稅是公民的義務.自覺納稅是公民社會責任感和...

為什麼相親時「男方必須有房有車」

自古以來在人類還是原始人的時候,女人會找強壯的男人進行交配,列如獅群,猴群,只有強者才有交配的權力,更何況,現在女人少男人多,金錢成了強者的象徵,這是人類的本能。談生意不講條件,不就成談戀愛了嗎?有車不是必要條件,但是很多人都會要求有房。自己不想付出,佔便宜的思想。相親後怎樣判斷戀愛關係 相親後,如...

為什麼移栽樹木時根部必須帶很多土

因為不帶土的話樹木的根部就容易受到傷害啊,根是用來吸取水分很養分的,根冠被破壞了,移植到新的地方短時間內無法長出新的根系去吸取水分,所以成活率就不高 春天移栽樹木,樹的根部要帶有乙個很大的土坨,這是為什麼 主要是為了保護土球,使根系不受損傷,提高移栽成活率,詳情可以關注中威快活林園林養護。1。可以保...