hashMap ,hashTable ,concurrentHashMap區別

1.實現方式

   public class hashTable extends Dictionary implements Map

   public class hashMap extends  AbstractMap implements Map 

   public class concurrentHashMap extends AbstractMap ......

    hashTable 和hashMap 都是實現了Map接口,但是hashTable 是繼承的Dictionary抽象類。

  concurrentHashMap比hashMap多Segment類,是可重入鎖,鎖分段技術保證線程安全的

2.安全性

hashTable是線程安全的。整個數組只有一把鎖,只要一個線程鎖住(讀或寫),其他線程只能等待。併發性能差。

hashMap 是線程不安全的。沒有加鎖機制。但是Collections.synchronizedMap(hashMap map)可以返回安全的實例。

concurrentHashMap是線程安全的。是將數組分爲若干個小數組,每個小數組維護自己的鎖。併發性能較好。

3.使用。

hashTable不能使用null做爲key ,value的值。

hashMap可以使用null作爲key,value的值。get()方法返回爲null時,有可能不存在該值或是值爲null,所以用containsKey()方法判斷是否存在某個鍵。

concurrentHashMap不允許key,value值爲null

4.迭代

hashMap使用Iterator迭代器。是fail-fast迭代器。所以當線程改變hashMap的結構,會拋出concurrentModification異常。

hashTable歷史使用了Enumeration迭代器,但同時也添加了Iterator迭代器。Enumeration不是fail-fast迭代器

5.hashCode

hashTable直接使用了對象的hashCode,hashMap重新計算hash值。

同時,兩個內部實現數組的初始大小和擴容方式也不同。

concurrentHashMap也是重新計算hash值。

使用一個對象作爲key值時,要重寫equals方法,同時要重寫hashCode方法。因爲是通過hashCode來確定散列到table中的位置,若有值再用equals判斷key是否相等。若不重寫hashCode,兩個對象會被散列到不同的位置,導致錯誤的結果。

PS:HashMap:jdk1.6中使用的是桶加鏈,jdk1.8中使用的是桶加鏈加紅黑樹

jdk1.8中index計算方式:h^(h>>>16)&(n-1)

若h爲1111 1111 1111 1111 1111 0000 1110 1010 則計算index爲0101 ---> 5.

6.hash衝突

參考文章:http://www.360doc.com/content/14/0721/09/16319846_395862328.shtml

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