jdk1.8的Hashtable原始碼解析
阿新 • • 發佈:2019-02-03
- HashMap是非執行緒安全的,Hashtable是執行緒安全的,所以Hashtable重量級一些,因為使用了synchronized關鍵字來保證執行緒安全。
- HashMap允許key和value都為null,而Hashtable都不能為null。
- Hashtable繼承自 JDK 1.0 的 Dictionary 虛擬類,而HashMap是 JDK 1.2 引進的 Map 介面的一個實現。
- Hashtable和HashMap擴容的方法不一樣,Hashtable中陣列預設大小11,擴容方式是 old*2+1。HashMap中陣列的預設大小是16,而且一定是2的指數,增加為原來的2倍。
- 兩者通過hash值雜湊到hash表的演算法不一樣,Hashtable是古老的除留餘數法,直接使用Object的hashcode,而後者是強制容量為2的冪,重新根據hashcode計算hash值,在使用hash和(hash表長度 – 1)進行與運算,也等價取膜,但更加高效,取得的位置更加分散,偶數,奇數保證了都會分散到。前者就不能保證。
- HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它執行緒改變了HashMap的結構(增加或者移除元素),將會丟擲ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會丟擲ConcurrentModificationException異常。以下面測試case為例: