HashMap、Hashtable、ConcurrentHashMap詳細解答

前言:

最近碰到了好多關於HashMapHashtable區別和練習題,小弟不才,從網上摘抄理解並作出如下總結。對於HashMapHashtableConcurrentHashMap的原理進行理解。網上文章多了去了,博而不精。在此闡述本人觀點,文章可以小,但應該做到句句點睛。

HashMap、Hashtable、ConcurrentHashMap聯繫

無論是HashMap、還是Hashtable、亦或是ConcurrentHashMap在內存中都是一個Entry的單項鍊表(哈希表的Key-Value鍵值對存儲在Entry鏈表中)。在Java中無論是HashMap還是Hashtable都是以Key-Value的鍵值對形式存儲元素的,使用hashCode()equals()函數來向集合添加、檢索元素。當調用put()方法時,會計算KeyHash值然後把鍵值對存貯在集合中適合的索引上。如果Key值已經存在(即常見的哈希衝突問題),Key會做出相應改變。其中Map存儲形式還有一些特性:容量(即哈希表的大小)、負載因子、擴容極限等。

閾(yu)值=容量*負載因子

HashMap、Hashtable、ConcurrentHashMap區別

1.首先辨別的就是這些特性,HashMap的初始容量大小爲16,當容量達到閾值後擴容2*n。Hashtable的初始容量大小爲11,當容量到達閾值後擴容2*n+1,兩者的負載因子都爲0.75

2.HashMap繼承自AbstractMap類,而Hashtable繼承自Dictionary,兩者皆實現了Map接口

3.關於線程安全性問題,HashMap是線程不安全的,而Hashtable是線程安全的。爲了實現線程安全同樣Hashtable失去了一些東西,Hashtable的效率低於HashMap。既然HashMap是線程不安全的,所以HashMap適用於單線程,Hashtable適用於多線程。

4.關於NullHashMap允許null值,Hashtable不允許null值存在

5.遍歷方法不同,倆者都可以使用迭代器來實現遍歷,但是Hashtable多了枚舉類型的遍歷。

6.hash值不同,Hashtable直接使用對象的哈希值,HashMap則重新計算對象的哈希值。

7.擴容方式不同,HashMap2的倍數擴容,Hashtable則以2*n+1擴容。

8.ConcurrentHashMapHashtable的主要區別在於鎖的粒度以及如何鎖,ConcurrenthashMap實現的是桶鎖,這種方法能夠顯著提高併發性。由於歷史原因,一般認爲Hashtable是遺留類(從這個不男不女的名字就可以看出來),可以使用ConcurrentHashMap來替代。

接下來在總結一下如何避免哈希衝突問題,有四種解決方式:

1.       開放地址法(線性探測再散列法、二次線性探測再散列法、僞隨機探測再散列法),也稱比哈希法

2.       再哈希法

3.       鏈地址法,也稱開哈西法

4.       建立公共溢出區

 



發佈了35 篇原創文章 · 獲贊 26 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章