前言:
最近碰到了好多關於HashMap、Hashtable區別和練習題,小弟不才,從網上摘抄理解並作出如下總結。對於HashMap、Hashtable、ConcurrentHashMap的原理進行理解。網上文章多了去了,博而不精。在此闡述本人觀點,文章可以小,但應該做到句句點睛。
HashMap、Hashtable、ConcurrentHashMap聯繫
無論是HashMap、還是Hashtable、亦或是ConcurrentHashMap在內存中都是一個Entry的單項鍊表(哈希表的Key-Value鍵值對存儲在Entry鏈表中)。在Java中無論是HashMap還是Hashtable都是以Key-Value的鍵值對形式存儲元素的,使用hashCode()和equals()函數來向集合添加、檢索元素。當調用put()方法時,會計算Key的Hash值然後把鍵值對存貯在集合中適合的索引上。如果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.關於Null,HashMap允許null值,Hashtable不允許null值存在
5.遍歷方法不同,倆者都可以使用迭代器來實現遍歷,但是Hashtable多了枚舉類型的遍歷。
6.hash值不同,Hashtable直接使用對象的哈希值,而HashMap則重新計算對象的哈希值。
7.擴容方式不同,HashMap以2的倍數擴容,Hashtable則以2*n+1擴容。
8.ConcurrentHashMap與Hashtable的主要區別在於鎖的粒度以及如何鎖,ConcurrenthashMap實現的是桶鎖,這種方法能夠顯著提高併發性。由於歷史原因,一般認爲Hashtable是遺留類(從這個不男不女的名字就可以看出來),可以使用ConcurrentHashMap來替代。
接下來在總結一下如何避免哈希衝突問題,有四種解決方式:
1. 開放地址法(線性探測再散列法、二次線性探測再散列法、僞隨機探測再散列法),也稱比哈希法
2. 再哈希法
3. 鏈地址法,也稱開哈西法
4. 建立公共溢出區