Map接口

概述:容器主要包括Collection和Map兩種,Collection存儲着單個對象的集合;而Map存儲着鍵值對(兩個對象key-->value)的映射表。

Collection、Set、List接口都屬於單值操作,每次只能操作一個對象;而Map接口與它們不同的是每次操作的都是一對對象,Map接口中的每個元素都是用“key-->value”的形式存儲在集合中。

 

一、Map接口繼承樹

說明:圖中的i:爲接口,c:爲類。

二、Map接口的常用子類

  • HashMap:基於哈希表實現;無序存放的,是新的操作類,key不允許重複。
  • Hashtable:和HashMap類似;無序存放,是舊的操作類,key不允許重複。但它是線程安全的,這意味着,同一時刻多個線程可以同時寫入HashTable並且不會導致數據不一致。它是遺留類,不應該去使用它。現在可以使用ConcurrentHashMap來支持線程安全,並且ConcurrentHashMap的效率會更高,因爲ConcurrentHashMap引入了分段鎖。

                                                                   HashMap與Hashtable的區別

序號

比較點

HashMap

Hashtable

1

推出時間

JDK1.2之後推出,屬於新的操作類

JDK1.0時推出,屬於舊的操作類

2

性能

採用異步處理方式,性能更高

採用異步處理方式,性能較低

3

線程安全

屬於非線程安全的操作類

屬於線程安全的操作類

4

空鍵

允許將key設置爲null

不允許將key設置爲null,否則將出現Null Pointer Exception異常

  • TreeMap:基於紅黑樹實現;可以排序的Map集合,按集合中的key排序,key不允許重複。
  • WeakHashMap:弱引用的Map集合,當集合中的某些內容不再使用時清除掉無用的數據,使用gc進行回收。
  • IdentityHashMap:key可以重複的Map集合。
  • LinkedHashMap:使用雙向鏈表來維護元素的順序,順序爲插入順序或者最近少使用(LRU)順序。

 

三、各種Map實現類選擇策略

1、正常情況使用HashMap,而不是Hashtable。

2、如果考慮排序,那麼考慮使用TreeMap。通常TreeMap比HashMap等在插入、刪除操作時要慢不少,因爲它需要在底層採用紅黑樹來管理key-value對。

3、如果考慮插入時的順序,那麼使用LinkedHashMap是個不錯的選擇。

4、如果想優化垃圾回收,建議使用WeakHashMap實現類(本文未提及);要求key完全匹配(同一對象),則使用IdentityHashMap;還有枚舉類不多說了。

5、關於null值:Hashtable不允許key爲null,也不允許value爲null;TreeMap與EnumMap不允許key爲null;HashMap及其子類LinkedHashMap,IdentityHashMap允許key爲null。 

 

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