Hashtable和HashMap的區別:
1.Hashtable是Dictionary的子類,HashMap是Map介面的一個實現類;
2.Hashtable中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。即是說,在多執行緒應用程式中,不用專門的操作就安全地可以使用Hashtable了;而對於HashMap,則需要額外的同步機制。但HashMap的同步問題可透過Collections的一個靜態方法得到解決:Map Collections.synchronizedMap(Map m)這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多執行緒的環境中也是安全的。
3.在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。 Map├Hashtable├HashMap└WeakHashMapMap介面 請注意,Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同的key,每個key只能對映一個value。Map介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。Hashtable類 Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。 新增資料使用put(key, value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。Hashtable透過initial capacity和load factor兩個引數調整效能。通常預設的load factor0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查詢時間將增大,這會影響像get和put這樣的操作。使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”: Hashtable numbers = new Hashtable(); numbers.put(“one”, new Integer(1)); numbers.put(“two”, new Integer(2)); numbers.put(“three”, new Integer(3)); 要取出一個數,比如2,用相應的key: Integer n = (Integer)numbers.get(“two”); System.out.println(“two = ” + n); 由於作為key的物件將透過計算其雜湊函式來確定與之對應的value的位置,因此任何作為key的物件都必須實現hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照雜湊函式的定義,如果兩個物件相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個物件不同,則它們的hashCode不一定不同,如果兩個不同物件的hashCode相同,這種現象稱為衝突,衝突會導致操作雜湊表的時間開銷增大,所以儘量定義好的hashCode()方法,能加快雜湊表的操作。 如果相同的物件有不同的hashCode,對雜湊表的操作會出現意想不到的結果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時複寫equals方法和hashCode方法,而不要只寫其中一個。 Hashtable是同步的。HashMap類 HashMap和Hashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和nullkey。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。WeakHashMap類 WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key可以被GC回收。
Hashtable和HashMap的區別:
1.Hashtable是Dictionary的子類,HashMap是Map介面的一個實現類;
2.Hashtable中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。即是說,在多執行緒應用程式中,不用專門的操作就安全地可以使用Hashtable了;而對於HashMap,則需要額外的同步機制。但HashMap的同步問題可透過Collections的一個靜態方法得到解決:Map Collections.synchronizedMap(Map m)這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多執行緒的環境中也是安全的。
3.在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。 Map├Hashtable├HashMap└WeakHashMapMap介面 請注意,Map沒有繼承Collection介面,Map提供key到value的對映。一個Map中不能包含相同的key,每個key只能對映一個value。Map介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。Hashtable類 Hashtable繼承Map介面,實現一個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。 新增資料使用put(key, value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。Hashtable透過initial capacity和load factor兩個引數調整效能。通常預設的load factor0.75較好地實現了時間和空間的均衡。增大load factor可以節省空間但相應的查詢時間將增大,這會影響像get和put這樣的操作。使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”: Hashtable numbers = new Hashtable(); numbers.put(“one”, new Integer(1)); numbers.put(“two”, new Integer(2)); numbers.put(“three”, new Integer(3)); 要取出一個數,比如2,用相應的key: Integer n = (Integer)numbers.get(“two”); System.out.println(“two = ” + n); 由於作為key的物件將透過計算其雜湊函式來確定與之對應的value的位置,因此任何作為key的物件都必須實現hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照雜湊函式的定義,如果兩個物件相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個物件不同,則它們的hashCode不一定不同,如果兩個不同物件的hashCode相同,這種現象稱為衝突,衝突會導致操作雜湊表的時間開銷增大,所以儘量定義好的hashCode()方法,能加快雜湊表的操作。 如果相同的物件有不同的hashCode,對雜湊表的操作會出現意想不到的結果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時複寫equals方法和hashCode方法,而不要只寫其中一個。 Hashtable是同步的。HashMap類 HashMap和Hashtable類似,不同之處在於HashMap是非同步的,並且允許null,即null value和nullkey。,但是將HashMap視為Collection時(values()方法可返回Collection),其迭代子操作時間開銷和HashMap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將HashMap的初始化容量設得過高,或者load factor過低。WeakHashMap類 WeakHashMap是一種改進的HashMap,它對key實行“弱引用”,如果一個key不再被外部所引用,那麼該key可以被GC回收。