淺談Java中的hashcode方法

 淺談Java中的hashcode方法  -----> http://www.cnblogs.com/dolphin0520/p/3681042.html      html

 首先,想要明白hashCode的做用,你必需要先知道Java中的集合。java

  總的來講,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。你知道它們的區別嗎?前者集合內的元素是有序的,元素能夠重複;後者元素無序,但元素不可重複。那麼這裏就有一個比較嚴重的問題了:要想保證元素不重複,可兩個元素是否重複應該依據什麼來判斷呢?這就是Object.equals方法了。可是,若是每增長一個元素就檢查一次,那麼當元素不少時,後添加到集合中的元素比較的次數就很是多了。也就是說,若是集合中如今已經有1000個元素,那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大下降效率。因而,Java採用了哈希表的原理。哈希(Hash)其實是我的名,因爲他提出一哈希算法的概念,因此就以他的名字命名了。哈希算法也稱爲散列算法,是將數據依特定算法直接指定到一個地址上。若是詳細講解哈希算法,那須要更多的文章篇幅,我在這裏就不介紹了。初學者能夠這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並非)。程序員

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

    因此,Java對於eqauls方法和hashCode方法是這樣規定的:編程

一、若是兩個對象相同,那麼它們的hashCode值必定要相同;api

二、若是兩個對象的hashCode相同,它們並不必定相同,上面說的對象相同指的是用eqauls方法比較。數據結構

    你固然能夠不按要求去作了,但你會發現,相同的對象能夠出如今Set集合中。同時,增長新元素的效率會大大降低。編碼

這是一種算法,數據結構裏面有提到。在某一個地址上(對應一個哈希值,該值並不特指內存地址),存儲的是一個鏈表。在put一個新值時,根據該新值計算出哈希值,找到相應的位置,發現該位置已經蹲了一個,則新值就連接到舊值的下面,由舊值指向(next)它(也多是倒過來指。。。)。能夠參考HashMap。spa

能夠把hashcode理解爲,一大片有編號的桶,若是你的散列算法好的話,能夠保證每一個不一樣的對象能夠放在不一樣的桶裏面,也就是每一個不一樣的對象都有不一樣的HashCode(同上的編號)。這樣的話,若是你尋找某個對象的時候,計算一下這個對象的hashcode而後直接就能夠到對應的桶裏面取道這個對象。翻譯

可是若是你的散列算法很差的話,也就是任何對象都有一個相同的hashCode,也就是說如今以後一個了,你全部的對象都要放在這個桶裏面,這樣的話,當你尋找某個對象的時候,雖然能夠很快肯定要去那個同裏面尋找,可是若是桶裏面有幾千萬個對象,那樣的話你就須要逐個調用equals了。效率就太差了.


hash code是一種編碼方式,在Java中,每一個對象都會有一個hashcode,Java能夠經過這個hashcode來識別一個對象。至於hashcode的具體編碼方式,比較複雜(事實上這個編碼是能夠由程序員經過繼承和接口的實現重寫的),能夠參考數據結構書籍。而hashtable等結構,就是經過這個哈希實現快速查找鍵對象。這是他們的內部聯繫,但通常編程時無需瞭解這些,只要知道hashtable實現了一種無順序的元素排列就能夠了。.

兩個對象值相同(x.equals(y) == true),則必定有相同的hash code。

由於:Hash,通常翻譯作「散列」,也有直接音譯爲"哈希"的,就是把任意長度的輸入(又叫作預映射, pre-maping),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小於輸入的空間,不一樣的輸入可能會散列成相同的輸出,而不可能從散列值來惟一的肯定輸入值。

如下是java語言的定義:

1) 對象相等則hashCode必定相等;

2) hashCode相等對象未必相等。

這也涉及到如何寫自定義的hashCode方法的問題:必須符合以上條件。注意條件2中的未必。具體可參見java doc; Effective Java中有更詳細論述。

補充一點我的簡介 hash 就是 相似於數學集合, 每個鍵,k能夠對應一個或多個值,對象就相似於值,因此「相同的對象」具備相同的鍵值,也就是hashCode;

關鍵特性:單向性 抗衝突性 映射分佈均勻性和差分分佈均勻性

而MD5能夠說是目前應用最普遍的Hash算法

相關文章
相關標籤/搜索