黑馬程序員—Java中涉及到的哈希存儲知識

---------------------- JavaEE+Android、Java培訓、期待與您交流! ----------------------


最近在論壇裏發現好多人都在問hashCode()和內存地址之間的關係?HashMap和HashSet爲什麼效率很高?剛開始我因爲學過數據結構,腦海裏對哈希存儲有些瞭解,老師講的時候我就很輕鬆過去了,但是在回答問題的過程中我發現,真正表達出來真的不容易,我翻閱了以前的學過的數據結構,總結了好久。準備把自己理解的寫下來


下面來一個數據結構中的哈希表存儲的標準定義:

以線性表中的每個元素的某個數據項(最好是關鍵字)Key爲自變量,使用一種事先選定的函數H(Key)計算出函數值,將該值解釋爲一塊連續存儲空間(如數組空間)的單元地址(如數組的下標),將數據元素存儲到該單元中。

例如在a[10]中存入1,2,4,5,7值,哈希表會事先選定一個函數,假設該函數爲H(Key)=key*3,即每個要存入的值先乘以3,然後將H(Key)的值再和數組大小求餘,找到對應下標將Key存入。這個函數我們可以自己設置(不一定要乘以某個數,可以加入平方,立方,求餘,怎麼爽怎麼來,目的是爲了避免兩個值對應同一個下標產生衝突),乘以300都沒問題,因爲和數組求餘以後它的值和數組下標是對應的,這個函數值太大不會怎麼怎麼!

Java中HashCode()實現的就是上面怎麼得到數組下標的過程,他返回的就是對應存儲方式的單元地址(如數組下標)。

那麼如果真的遇到衝突怎麼辦?(得到的數組下標一樣。而且本來那塊連續的存儲空間就是有限的)

數據結構中提供了兩種方法,開放地址法,鏈接法。Java中採用的就是鏈接法,用單鏈表存儲,該數組下標中存入的是指向單鏈表的指針。如下圖:

到此,哈希存儲的具體原理知道了,可以看到它好像一本書有目錄的書一樣,在它裏面查找時效率非常高,所以哈希法存儲結構在數據結構中地位很高。這麼牛逼Java中肯定有不少地方用!



---------------------- JavaEE+Android、Java培訓、期待與您交流! ----------------------

詳細請查看: http://edu.csdn.net

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