1. 程式人生 > >jdk1.8的Hashtable原始碼解析

jdk1.8的Hashtable原始碼解析

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