一、類型介紹
Java 自帶了各種 Map 類洞坑。這些 Map 類可歸為三種類型:
1. 通用Map盲链,用于在應用程序中管理映射,通常在 java.util 程序包中實現(xiàn)
HashMap迟杂、Hashtable刽沾、Properties、LinkedHashMap排拷、IdentityHashMap侧漓、TreeMap、WeakHashMap监氢、ConcurrentHashMap
2. 專用Map布蔗,通常我們不必親自創(chuàng)建此類Map,而是通過某些其他類對其進行訪問
java.util.jar.Attributes浪腐、javax.print.attribute.standard.PrinterStateReasons纵揍、java.security.Provider、java.awt.RenderingHints议街、javax.swing.UIDefaults
3.?一個用于幫助我們實現(xiàn)自己的Map類的抽象類
AbstractMap
二泽谨、常見的幾個類型的區(qū)別
1?區(qū)別
1.1 基本
HashMap:初始化容量為16,擴容每次為2*oldCap,key-value可以為NULL值
Hashtable:初始化容量為11特漩,擴容每次為2*oldCap+1,key-value不可以為NULL值
TreeMap:初始化容量為0吧雹,內部是紅黑樹結構,不存在hash沖突的情況拾稳,不存在擴容的操作,key-value不可以為NULL值
1.2 實現(xiàn)
HashMap:實現(xiàn)了Map接口吮炕,繼承了AbstractMap類
Hashtable:實現(xiàn)了Map接口腊脱,繼承了AbstractMap類
TreeMap:由于TreeMap是有序的访得,所以其除了實現(xiàn)了Map接口,還實現(xiàn)了SortedMap陕凹、NavigableMap接口
1.3 內部原理
HashMap:HashMap是散列表實現(xiàn)悍抑,內部是數(shù)組+鏈表或者紅黑樹的結構
Hashtable:Hashtable也是散列表實現(xiàn),內部是數(shù)組+鏈表的結構
TreeMap:TreeMap內部是紅黑樹的結構
1.4 線程安全
HashMap:不是線程安全的杜耙,其實通過Map m = Collections.synchronizeMap(hashMap)的方式也可以使得HashMap變成線程安全的搜骡,但是這樣做對程序的性能可能是噩夢,在后面會介紹ConcurrentHashMap佑女,建議在多線程的情況下可以使用ConcurrentHashMap替換HashMap.
Hashtable:是線程安全的记靡,內部方法使用關鍵字synchronized修飾
TreeMap:不是線程安全的
三谈竿、常見用法
void clear() 從此映射中移除所有映射關系(可選操作)。
boolean containsKey(Object key) 如果此映射包含指定鍵的映射關系摸吠,則返回 true空凸。
boolean containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true寸痢。
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射關系的 Set 視圖呀洲。
boolean equals(Object o) 比較指定的對象與此映射是否相等。
V get(Object key) 返回指定鍵所映射的值啼止;如果此映射不包含該鍵的映射關系道逗,則返回 null。
int hashCode() 返回此映射的哈希碼值献烦。
boolean isEmpty()? 如果此映射未包含鍵-值映射關系滓窍,則返回 true。
Set<K> keySet()? 返回此映射中包含的鍵的 Set 視圖仿荆。
V put(K key, V value) 將指定的值與此映射中的指定鍵關聯(lián)(可選操作)贰您。
void putAll(Map<? extends K,? extends V> m)從指定映射中將所有映射關系復制到此映射中(可選操作)。
V remove(Object key) 如果存在一個鍵的映射關系拢操,則將其從此映射中移除(可選操作)锦亦。
int size() 返回此映射中的鍵-值映射關系數(shù)。
Collection<V> values() 返回此映射中包含的值的 Collection 視圖令境。
四杠园、遍歷
// 1.聲明一個Map?
?Map m=new HashMap();
for(Object obj : map.keySet()){
Object value = map.get(obj);
}