首先請先閱讀這兩個的源碼。
一、hashMap、hashTable都是Map接口的實現類,但是hashMap類繼承自抽象類abstractMap類,hashTable繼承自
Dictionary類,該類在jdk中這樣描述:
可見該類已經過時。
二、hashTable裏面的方法都是同步的,實現同步的方法是synchronized,hashMap是非同步的,但也可以使用Collections
類中的靜態方法使其變得同步。因此在單線程程序中hashMap的效率要高於hashTable,如果在多線程程序中,可以考慮使用
hashTable
三、hashTable不允許有null的鍵和值,hashMap允許有空的鍵和值
四、hashMap的遍歷是使用方法keySet()返回一個保存有所有鍵的Set視圖,然後用迭代器進行遍歷,採用的是fail-fast機制。
hashTable的遍歷可以使用elements()返回值的枚舉,也可以使用
entrySet()
keySet()
values()返回鍵的Collection視圖,
也可以使用
keys()返回鍵的枚舉。總之使用迭代器遍歷的都是fail-fast機制,用枚舉遍歷就不是了,儘量還是得使用迭代器。
import java.util.Enumeration; import java.util.Hashtable; public class Test implements Cloneable { public static void main(String[] args) { Hashtable<String,String> ht = new Hashtable<>(); ht.put("a", "1"); ht.put("b", "2"); ht.put("c", "3"); Enumeration<String> e = ht.keys(); while(e.hasMoreElements()) { ht.remove("b"); System.out.println(ht.get(e.nextElement())); } } }
結果:
null 1 3
五、兩者的初始化也有略微的不同
----------------------------------------------------------------------------------------------
可見初始化方式都一樣,只是初始容量不同,hashMap是16,hashTable爲11,hashMap默認必須爲2的n次方,以此來使
hash更爲均勻,提高hash表的性能。至於爲什麼默認爲0.75,這個應該是經驗問題,經過大量程序統計出來的最優值
吧。。