java常識2:equals()與hashCode()的覆寫

一、equals()的作用及equals()爲什麼通常要被覆寫使用:

“equals”中文譯爲“相等”。在java中,“==”也是判斷相等的運算符,而且使用方便,唯一的缺點就是“沒有個性”!

java語言構造了一個五光十色的世界,它可以被用來創造無數的類,而不同的類,在不同的場景下,用來判斷是否相等的標準也會是各種各樣的。比如:人雖然每個都不同,楊蜜和劉意非這兩個不同的人卻同樣都會去女浴室,也同樣都會去女洗手間,這是因爲這兩個不同的人,在性別這個維度上是一樣的。而我們使用傳統的“==”則相當於只是機械的根據身份證號碼區分身份一樣,無法做到根據場景根據具體類型來個性化處理。因此有了equals()方法。

可以說,equals()方法就是被設計用來在需要的場景下覆寫使用的。不然源碼爲啥要這麼寫?

equals()方法默認是通過“==”實現的(位於Object.java 148~150行):

    public boolean equals(Object obj) {
        return (this == obj);
    }

當我們需要“個性化”的“判斷是否相等”時,那麼我們就需要覆寫equals()方法。

二、hashCode()方法作用及equals()爲什麼通常要與equals()一起被覆寫使用:

“hash”:Hash,一般翻譯做散列、雜湊,或音譯爲哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。(摘自:百度百科《Hash(哈希)》詞條)

“hashCode”:原始輸入,經過哈希函數的處理,得到的輸出結果就是hashCode。這裏的hashCode()方法就是所謂的“哈希函數”。

哈希我們可以簡單理解爲:爲對象產生一個編號,並按照這個編號將它放在一個特定的位置。

在集合類中,當一個元素加入到集合中,由於集合中的元素具有唯一性,而該方法就是默認被用來判斷集合中的元素是否相等的方法。因此,我們通常在覆寫equals()時,爲了使後期該類的實例,可以在集合類中以你需要的“個性化標準”判斷是否是同一個對象,所以我們一併覆寫hashCode()方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章