哈希碼的計算 (hashCode()與equals() )


在Java世界中,所有的類都源自基類object,在object類中,有public native int hashCode(),該方法返
回一個hash值:Java中的hashCode方法就是根據一定的規則將與對象相關的信息(比如對象的存儲地址,對
象的字段等)映射成一個數值,這個數值稱作爲散列值。
1)自主選擇一個類,說明它hashCode方法的設計理念和代碼核心邏輯。


類hashmap
代碼:
JDK8 
        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }

2)  舉例說明。
我嘗試從一下兩個方面去分析爲什麼在JDK8中改進了hashmap的hashcode()方法。
1.從 return Objects.hashCode(key) ^ Objects.hashCode(value)這個公式來看,hashmap的hashcode()直接調用了object類的hashCode()方法,在前面說過,這個方法是native方法,通常來說,native方法比本地方法執行的要快,同時,採用"^"異或運算,使得運行速度再次提高。
2.Objects.hashCode()方法的參數,分別是hashmap的KEY和VALUE,這使得不同的<K,V>傳入進來,hash碰撞的概率將大大的降低,所以此處用hashCode()方法來檢驗對象是否相等,就有了一點equals()方法的感覺了,不再像以前那樣的生硬。

我感覺這個源碼應該是JDK中最優美最質樸最高效又含義最豐富的代碼了,對於新手來說,也能看懂,對於大神來說,能看到一層又一層的涵義,我經驗淺薄,只能看到浮於表面的兩點內容,希望自己能有一天可以寫出這麼“不可思議”的代碼。
回到討論本身,說到hashcode()方法必然離不開equals()方法。他們的作用其實一樣,在Java裏都是用來對比兩個對象是否相等一致。但是重寫的equal()裏一般比較的比較全面比較複雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高,那麼hashCode()既然效率這麼高爲什麼還要equal()呢, 因爲hashCode()並不是完全可靠,有時候不同的對象他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,並不是絕對可靠,這也是所說的hash碰撞。只有把hashCode()和equals()結合起來使用,才能使得判斷對象是否相等的準確性達到最高。

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