search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Java中hashcode詳解

什麼是hash

在此之前我們先來了解下什麼是Hash:

Hash是散列的意思,就是把任意長度的輸入,通過散列演算法變換成固定長度的輸出,該輸出就是散列值。關於散列值,有以下幾個關鍵結論:

1、如果散列表中存在和散列原始輸入K相等的記錄,那麼K必定在f(K)的存儲位置上

2、不同關鍵字經過散列演算法變換后可能得到同一個散列地址,這種現象稱為碰撞

3、如果兩個Hash值不同(前提是同一Hash演算法),那麼這兩個Hash值對應的原始輸入必定不同

什麼是hashcode

然後講下什麼是HashCode,總結幾個關鍵點:

1、HashCode的存在主要是為了查找的快捷性,HashCode是用來在散列存儲結構中確定對象的存儲地址的

2、如果兩個對象equals相等,那麼這兩個對象的HashCode一定也相同

3、如果對象的equals方法被重寫,那麼對象的HashCode方法也盡量重寫

4、如果兩個對象的HashCode相同,不代表兩個對象就相同,只能說明這兩個對象在散列存儲結構中,存放於同一個位置

hashcode作用

首先,想要明白hashCode的作用,你必須要先知道Java中的集合。

總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。那麼這裡就有一個比較嚴重的問題了:要想保證元素不重複,可兩個元素是否重複應該依據什麼來判斷呢?這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那麼當元素很多時,后添加到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。

於是,Java採用了哈希表的原理。哈希(Hash)實際上是個人名,由於他提出一哈希演算法的概念,所以就以他的名字命名了。哈希演算法也稱為散列演算法,是將數據依特定演算法直接指定到一個地址上。如果詳細講解哈希演算法,那需要更多的文章篇幅,所以這裡就不介紹了。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。

這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。所以這裡存在一個衝突解決的問題。這樣一來實際調用equals方法的次數就大大低了,幾乎只需要一兩次。

所以,Java對於eqauls方法和hashCode方法是這樣規定的:如果兩個對象相同,那麼它們的hashCode值一定要相同。如果兩個對象的hashCode相同,它們並不一定相同。

為什麼重寫eqauls一定要重寫hashcode

由於為了提高程序的效率才實現了hashcode方法,先進行hashcode的比較,如果不同,那沒就不必在進行equals的比較了,這樣就大大減少了equals比較的次數,這對比需要比較的數量很大的效率提高是很明顯的,在上面hashcode作用中我就舉了一個在集合中的使用的列子。

其實簡單的說就是為了保證同一個對象,保證在equals相同的情況下hashcode值必定相同,如果重寫了equals而未重寫hashcode方法,可能就會出現兩個沒有關係的對象equals相同的(因為equal都是根據對象的特徵進行重寫的),但hashcode確實不相同的。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦