1.Hashtable是Dictionary的子類,HashMap是Map接口的實現類。
2.方法2。Hashtable是同步的,而HashMap中的方法在默認情況下是異步的。也就是說,在多線程應用中,不需要特殊操作就可以安全使用Hashtable對於HashMap,需要壹個額外的同步機制。但是HashMap的同步問題可以通過集合的靜態方法來解決:
地圖集合. synchronizedMap(地圖m)
這個方法返回壹個同步映射,它封裝了底層HashMap的所有方法,使得底層HashMap即使在多線程環境中也是安全的。
3.在HashMap中,null可以作為壹個鍵,而且這樣的鍵只有壹個;壹個或多個鍵可以有空值。當get()方法返回壹個null值時,可能意味著這個鍵在HashMap中不存在,或者對應於這個鍵的值為null。所以HashMap中是否有鍵不能用get()方法來判斷,應該用containsKey()方法來判斷。
地圖
├Hashtable
├HashMap
└WeakHashMap
地圖
註意,映射不繼承集合接口,映射提供了從鍵到值的映射。壹個映射不能包含相同的鍵,每個鍵只能映射壹個值。Map接口提供了三個集合的視圖,Map的內容可以看作是壹組鍵集、壹組值集或壹組鍵-值映射。哈希表類
Hashtable繼承了Map接口,並實現了壹個鍵值映射的哈希表。任何非空對象都可以用作鍵或值。
Put(key,value)用於添加數據,get(key)用於檢索數據。這兩個基本操作的時間成本是不變的。
Hashtable通過兩個參數調整性能:初始容量和負載系數。通常情況下,默認的負載系數0.75可以很好地平衡時間和空間。增加加載因子可以節省空間,但相應的搜索時間會增加,這會影響get和put之類的操作。
使用Hashtable的壹個簡單例子如下:把1,2,3放入Hashtable,它們的鍵分別是“壹”,“二”,“三”:
哈希表編號=新哈希表();
numbers.put("one ",新整數(1));
numbers.put("two ",新整數(2));
numbers.put("三",新整數(3));
要取出壹個數字,如2,使用相應的鍵:
整數n =(Integer)numbers . get(" two ");
system . out . println(" two = "+n);
因為作為鍵的對象將通過計算其散列函數來確定其對應值的位置,所以任何作為鍵的對象都必須實現hashCode和equals方法。HashCode和equals方法繼承自根類對象。如果您使用用戶定義的類作為鍵,您應該非常小心。根據hash函數的定義,如果兩個對象相同,即obj1.equals(obj2)=true,則它們的hashcode壹定相同,但如果兩個對象不同,則它們的hashcode不壹定不同。如果兩個不同對象的hashCode相同,這種現象叫做沖突,沖突會增加操作哈希表的時間成本。因此,可以通過盡可能好地定義hashCode()方法來加速哈希表的操作。
如果同壹個對象有不同的hashCode,那麽對哈希表的操作會產生意外的結果(預期的get方法返回null)。要避免這個問題,只要記住壹點:同時復制equals方法和hashCode方法,不要只寫其中壹個。
哈希表是同步的。HashMap類
HashMap類似於Hashtable,但區別在於HashMap是異步的,並且允許空值,即null值和nullkey。但是,當HashMap被看作壹個集合時(values()方法可以返回集合),叠代子操作的時間開銷與HashMap的容量成正比。所以,如果叠代運算的性能非常重要,就不要把HashMap的初始化容量設置得太高,或者把加載因子設置得太低。WeakHashMap類
WeakHashMap是壹個改進的HashMap,它實現了對壹個鍵的“弱引用”。如果壹個鍵不再被外部引用,它可以被GC回收。