hashMap與hashTable的區別

    首先請先閱讀這兩個的源碼。

一、hashMap、hashTable都是Map接口的實現類,但是hashMap類繼承自抽象類abstractMap類,hashTable繼承自

Dictionary類,該類在jdk中這樣描述:

捕獲.PNG

可見該類已經過時。

二、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

五、兩者的初始化也有略微的不同

捕獲.PNG

----------------------------------------------------------------------------------------------

捕獲.PNG

可見初始化方式都一樣,只是初始容量不同,hashMap是16,hashTable爲11,hashMap默認必須爲2的n次方,以此來使

hash更爲均勻,提高hash表的性能。至於爲什麼默認爲0.75,這個應該是經驗問題,經過大量程序統計出來的最優值

吧。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章