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