HashMap、HashTable、HashSet詳解

芬達礦泉水發表於2018-02-21

所謂hash,實際上就是雜湊,音譯為雜湊,就是通過雜湊演算法,將輸入轉換為固定長度的輸出,詳情點選傳送門

HashMap

1.建立hashMap時,可以指定建立長度和負載因子的map(其中負載因子,指的是已經使用儲存空間與實際儲存空間的比值,比值越大,節省空間,但是搜尋速度會變慢,過小,浪費空間,但是搜尋速度快,預設值 為0.75)

2.檢視hashMap的put方法的原始碼實現


下圖為確定hashCode在陣列table中的索引位置,非常巧妙,當length總為2的次方時,假設 h=5,length=16, 那麼 h & length - 1 將得到 5;如果 h=6,length=16, 那麼 h & length - 1 將得到 6 ...    從而確定在陣列中的位置


該原始碼體現了,hashMap中是允許存在空的鍵值,迴圈中,解決了當存在相同hashCode出現hash碰撞時的解決方法,並對存在鍵的舊值替換為新值,所以hashMap中不能存在重複鍵

小結:a.hashMap中是允許存在空的鍵值

         b.hash碰撞時,通過實體鏈儲存進行解決

         c.hashMap中不能存在重複鍵

3.hashMap中對空鍵的處理putForNullKey方法


4.hashMap中的get方法

  下圖為get方法中呼叫的getEntry方法


5.hashMap對於resize表陣列的處理


resize時必須進行位置的重新計算,不然不能找到準確的資料

與hashTable的區別

A.hashTable中預設為synchronized,同步的,執行緒安全

B.由上可得出,hashMap可以存在空的鍵值,(判斷hashMap中是否存在一個鍵只能使用containsKey,不能使用get),hashTable不允許存在空的鍵值

對於hashSet

hashSet底層的實現就是採用的hashMap,只是進行了一次封裝,將資料存到key中,value存入的是PRESENT,就是一個Object




參考自:http://blog.csdn.net/bear_wr/article/details/52275874

相關文章