天天看點

Hashtable源碼解析

Hashtable同樣是基于哈希表實作的,同樣每個元素是一個key-value對,其内部也是通過單連結清單解決沖突問題,容量不足(超過了閥值)時,同樣會自動增長。

Hashtable也是JDK1.0引入的類,是線程安全的,能用于多線程環境中。

Hashtable同樣實作了Serializable接口,它支援序列化,實作了Cloneable接口,能被克隆。

1、二者的存儲結構和解決沖突的方法都是相同的。

2、HashTable在不指定容量的情況下的預設容量為11,而HashMap為16,Hashtable不要求底層數組的容量一定要為2的整數次幂,而HashMap則要求一定為2的整數次幂。

3、Hashtable中key和value都不允許為null,而HashMap中key和value都允許為null(key隻能有一個為null,而value則可以有多個為null)。但是如果在Hashtable中有類似put(null,null)的操作,編譯同樣可以通過,因為key和value都是Object類型,但運作時會抛出NullPointerException異常,這是JDK的規範規定的。

4、Hashtable擴容時,将容量變為原來的2倍加1,而HashMap擴容時,将容量變為原來的2倍。

5、Hashtable計算hash值,直接用key的hashCode(),而HashMap重新計算了key的hash值,Hashtable在求hash值對應的位置索引時,用取模運算,而HashMap在求位置索引時,則用與運算,且這裡一般先用hash&0x7FFFFFFF後,再對length取模,&0x7FFFFFFF的目的是為了将負的hash值轉化為正值,因為hash值有可能為負數,而&0x7FFFFFFF後,隻有符号外改變,而後面的位都不變。

6、Hashtable是線程安全的,HashMap不是