類集面試題(二)HashMap、Hashtable、TreeMap和WeakHashMap有哪些區別


Java爲數據結構中的映射定義了一個接口java.util.Map。它包含三個類:HashMap、Hashtable和TreeMap。Map是用來存儲鍵值對的數據結構,在數組中通過數組下標來對其內容索引的,而在Map中,則是通過對象進行索引,用來索引的對象稱作是Key,其對應的對象叫做value。
HashMap是最常用的Map,它根據鍵值對的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。由於HashMap和Hashtable都採用了hash法進行索引,因此二者具有許多相似之處,它們主要有如下區別
1、HashMap是HashTable的輕量級實現(非線程安全的實現),它們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key)但是注意它只允許一條記錄的鍵爲null,不允許多條記錄的鍵爲null,而Hashtable不允許。
2、HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey,因爲contains方法容易引起誤解。Hashtable繼承Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
3、Hashtable的方法是線程安全的,而HashMap不支持線程的同步,所以它不是線程安全的。在多個線程訪問Hashtable時,不需要開發人員對它進行同步,而HashMap,開發人員必須實現額外的同步機制。所以,就效率而言,HashMap可能高於Hashtable。
4、Hashtable使用Enumeration,HashMap使用Iterator。
5、Hashtable和HashMap採用的hash/rehash算法幾乎都一樣,所以性能不太會有差別
6、在Hashtable中,hash數組的默認的大小是11,增加的方式是old*2+1.在HashMap中,hash數組的默認大小是16,而且一定是2的指組。
7、hash值的使用不同,Hashtable直接使用對象的hashCode。
在上面的三種類型中,我們使用最多的是HashMap。HashMap裏面存入的鍵值對取出時沒有固定的順序,是隨機的。一般而言,在Map中插入、刪除和定位元素,HashMap是最好的選擇。由於TreeMaP實現類SortMap接口,能夠把它保存的記錄根據鍵排序,因此,取出來的是排序後的鍵值對,如果需要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。LinkedHashMap是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現,它還可以按讀取順序來排序。
WeakHashMap與HashMap類似,二者的不同之處在於WeakHashMap中key採用的是"弱引用"的方式,只要WeakHashMap中的key值不再被外部引用,它就可以被垃圾回收器回收。而HashMap中key採用的是“強引用方式”,當HashMap中的kay沒有被外部引用時,只有在這個key從HashMap中刪除後,纔可以被垃圾回收器回收。

敲黑板

HashMap

1、非線程安全
2、允許null鍵值,但是只能有一個
3、沒有contais方法,改成了containsvalue和containsKey
4、HashMap是Map interface的一個實現
5、HashMap使用Iterator迭代輸出
6、默認數組大小是16,而且一定是2的指數
7、鍵值對隨機插入

Hashtable

1、線程安全
2、不能有null鍵值
3、有contains方法
4、Hashtable繼承Dictionary
5、Hashtable使用Enumeration輸出
6、數組默認大小是11,增加方式是old*+1

TreeMap

1、在HashMap的基礎上實現了SortMap接口

LinkedHashMap

1、是HashMap的一個子類,如果需要輸出順序與輸入順序相同,考慮使用它

WeakHashMap

HashMap的弱引用類型

贈送筆試題

在Hashtable上下文中,同步指的是什麼?

意味着在同一時間點只能有一個線程可以修改hash表,任何線程在執行Hashtable的更新操作前都要獲取對象鎖,其他線程則等待鎖的釋放

如何實現HashMap

HashMap可以通過

Map m=Collections.synchronizedMap(new HashMap())

來達到同步效果。具體而言,該方法返回一個同步Map,該Map封裝了底層HashMap的所有方法,使得底層的HashMap即使在多線程的環境中也是安全的。

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