關於hashCode和equals重寫

2022-09-10 04:39:13 字數 1907 閱讀 2654

規則

只要重寫equals,就必須重寫hashcode。

用set儲存物件或者用物件作為map的鍵時,必須重寫hashcode。也就是說,當需要用物件的雜湊值來判斷物件是否相等時必須重寫hashcode。

說明:string重寫了hashcode和equals方法,所以我們可以非常愉快地使用string物件作為key來使用。

介紹equals的作用是用來判斷兩個物件是否相等。

hashcode 的作用是獲取雜湊碼,也稱為雜湊碼;它實際上是返回乙個int整數,這個雜湊碼的作用是確定該物件在雜湊表中的索引關係。

關係(我們以「類的用途」來將「hashcode()和equals()的關係」分兩種情況來說明)

不會建立「類對應的雜湊表」

不會建立類對應的雜湊表是說:我們不會在hashset, hashtable, hashmap等等這些本質是雜湊表的資料結構中,用到該類。例如,不會建立該類的hashset集合,不會以該類作為map的鍵。在這種情況下,hashcode和 equals是沒有關係的。而hashcode() 則根本沒有任何作用。

equals() 用來比較該類的兩個物件是否相等,必要時還是需要重寫。以下這種情況按照正常業務應該返回true,但是實際結果卻是false。

public static void main(string args)
重寫equals我們就可以根據我們實際的情況來判斷是否相等。

@override

public boolean equals(object o)

if (o == null || getclass() != o.getclass())

student student = (student) o;

return age == student.age && objects.equals(name, student.name);

}

這種情況下,hashcode沒有實際意義

會建立類對應的雜湊表

建立類對應的雜湊表是說:我們會在hashset,hashtable,hashmap等等這些本質是雜湊表的資料結構中,用到該類。在這種情況下,該類的「hashcode()和equals()」是有關係的:

如果兩個物件相等,那麼hashcode返回的值一定相等,通過equals比較兩個物件也相等。

如果兩個物件hashcode()相等,它們並不一定相等。因為在雜湊表中,hashcode相等,即兩個鍵值對的雜湊值相等。然而雜湊值相等,不一定能得出鍵值對相等。補充說一句:「兩個不同的鍵值對,雜湊值相等」,這就是雜湊衝突。

總結以程式角度看圖1中student1和student2必然是兩個不同的物件,new物件的時候jvm分配的不通的記憶體。但是以業務和物件導向來看,student1和student2的所有屬性都相同,我們必須把他們當成同乙個物件來處理。需要比較的時候我們則需要重寫equals來具體比較物件的屬性值,用set去重時我們也得重寫hashcode來給這種相對的物件返回相等的雜湊值。如果沒有以上需求則不用重寫hashcode和equals,這兩者也沒有關係。這是自己對重hashcode和equals的理解,因為自己技術菜理解比較片面。專業解釋還請看 說說hashcode() 和 equals() 之間的關係。

類對應的雜湊表

雜湊表(hash table,也叫雜湊表),是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

給定表m,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的位址,則稱表m為雜湊(hash)表,函式f(key)為雜湊(hash) 函式。

關於hashCode和equals重寫

只要重寫equals,就必須重寫hashcode。用set儲存物件或者用物件作為map的鍵時,必須重寫hashcode。也就是說,當需要用物件的雜湊值來判斷物件是否相等時必須重寫hashcode。說明 string重寫了hashcode和equals方法,所以我們可以非常愉快地使用string物件作...

關於重寫equals與hashCode

override public boolean equals object obj else if uname.equals user.uname return false if null else if equals user.return false if city null else if c...

Java equals和hashCode的理解

我們一般使用equals都是為了比較物件的內容,而object裡面的equals方法卻是比較物件的引用,如下 public boolean equals object obj 所以當我們想要比較的是物件的內容時,需要重寫equals方法,假設user類中有string name int age 兩個...