一、簡述
public interface Map<K,V>將鍵映射到值的對象。一個映射不能包含重復的鍵;每個鍵最多只能映射到一個值。
注意:Map中的集合不能包含重復的鍵,值可以重復。每個鍵只能對應一個值。
Map集合是鍵值對形式存儲值的,所以遍歷Map集合無非就是獲取鍵和值,根據實際需求,進行獲取鍵和值。
Map接口提供三種collection試圖,允許以鍵集、值集或鍵-值集映射關系集的形式查看某個映射的內容。映射順序 定義為迭代器在映射的 collection 視圖上返回其元素的順序。某些映射實現可明確保證其順序,如 TreeMap 類;另一些映射實現則不保證順序,如 HashMap 類。
注:
將可變對象用作映射鍵時必須格外小心。當對象是映射中某個鍵時,如果以影響 equals 比較的方式更改了對象的值,則映射的行為將是不確定的。此項禁止的一種特殊情況是不允許某個映射將自身作為一個鍵包含。雖然允許某個映射將自身作為值包含,但請格外小心:在這樣的映射上 equals 和 hashCode 方法的定義將不再是明確的。
所有通用的映射實現類應該提供兩個“標準的”構造方法:
一個 void(無參數)構造方法,用于創建空映射;
一個是帶有單個 Map 類型參數的構造方法,用于創建一個與其參數具有相同鍵-值映射關系的新映射。
實際上,后一個構造方法允許用戶復制任意映射,生成所需類的一個等價映射。盡管無法強制執行此建議(因為接口不能包含構造方法),但是 JDK 中所有通用的映射實現都遵從它。
二、Map接口
public interface Map<K, V>{int size(); //返回此映射中的鍵-值映射關系數。boolean isEmpty(); //如果此映射未包含鍵-值映射關系,則返回 true。boolean containsKey(Object key); //如果此映射包含指定鍵的映射關系,則返回 true。boolean containsValue(Object value) //如果此映射將一個或多個鍵映射到指定值,則返回 true。V get(Object key); //根據key查找對應value數據,如果沒有,則返回 null。V put(K key, V value); //向集合保存數據可選操作)。V remove(Object key); //如果存在一個鍵的映射關系,則將其從此映射中移除(可選操作)。void putAll(Map<? extends K, ? extends V> m); //從指定映射中將所有映射關系復制到此映射中(可選操作)。void clear(); //從此映射中移除所有映射關系(可選操作)。Set<K> KeySet(); //返取出全部key。Collection<V> values(); //返回此映射中包含的值的 Collection 視圖。Set<Map, Entry<K, V>> entrySet(); //即將Map集合轉化為Set集合。interface Entry<K, V> {K getKey();V getValue();V setValue(V value);boolean equals(Object o);int hashCode(); }boolean equals(Object o); //比較指定的對象與此映射是否相等。int hashCode(); //返回此映射的哈希碼值。
}
三、具體實現
接口java.util.Map,包括3個實現類:HashMap、Hashtable、TreeMap。當然還有LinkedHashMap、ConcurrentHashMap 、WeakHashMap。
Map是用來存儲鍵值對的數據結構,鍵值對在數組中通過數組下標來對其內容索引的,而鍵值對在Map中,則是通過對象來進行索引,用來索引的對象叫做key,其對應的對象叫value。
四、Map的兩種取值方式KeySet、entrySet
(一)KeySet
先獲取所有鍵的集合,再根據鍵獲取對應的值。(即先找到丈夫,再去找妻子)
keySet的演示圖解
(二)entrySet
先獲取map中的鍵值關系封裝成一個個的entry對象, 存儲到一個Set集合中,再迭代這個Set集合, 根據entry獲取對應的key和value。向集合中存儲自定義對象(entry類似于是結婚證)
entrySet的演示圖解
HashMap : 內部結構是哈希表,不是同步的。允許null作為鍵,null作為值。
TreeMap : 內部結構是二叉樹,不是同步的。可以對Map集合中的鍵進行排序。
五、HashMap