https://docs.oracle.com/javase/8/docs/api/java/util/Map.html
public interface Map<K,V>
K—key,V——value;
常用的實現類:HashMap,HashTable,LinkedHashMap。
一、簡介
Map是Java集合框架的根接口,另一個是Collection接口。
一個Map中,不能包含重復的key;一個key只能映射到一個value。
Map並不是一種集合,但是Map可以提供三種集合視圖:
- key-value映射的Set視圖;
- key的set視圖;
- value的Collection視圖
Map的順序被定義為Map的集合視圖上的迭代器所返回元素的順序。而一些實現類如TreeMap,自定義了順序;一些則沒有(HashMap)。
如果一個可變(Mutable)對象作為Map的key,需要特別注意,如果這個對象的修改影響到了equals比較,那map的行為是不明確的。針對此種情況有一個很好的示例,Map不允許將自身作為key,因為這種情況下,equals()和hashcode()不能被很好地定義。
一般用途的Map應該提供兩個構造函數:
- 無參構造函數,創建一個空的Map;
- 有一個形參為Map的構造函數,即復制一個Map;
Map的實現類對所包含的元素會有不同的限制,HashTable的鍵和值都不允許為null,HashMap的鍵和值都允許為null
二、嵌套類(接口)
Map接口中有一個嵌套類,當然實際上是一個接口。
public static interface Map.Entry<K,V>
它是一個map的key-value條目。Map的entrySet()方法返回一個map的集合視圖,這個返回的Collection視圖中的元素類型就是Map.Entry<K,V>。
要想獲得一個map entry的引用,唯一途徑就是這個集合視圖的迭代器。這些Map.Entry對象僅在迭代期間有效
the behavior of a map entry is undefined if the backing map has been modified after the entry was returned by the iterator, except through the setValue operation on the map entry.
三、方法
1、int size()
返回key-value映射的數目
2、boolean isEmpty()
若Map不包含任何key-value映射,返回true。
3、boolean containsKey(Object key)
若Map含有指定的key鍵,返回true。
Throws:
- ClassCastException - 如果key鍵的類型不適用這個映射(可選)
- NullPointerException - 如果指定的key鍵為空,並且此映射不允許null(可選)
4、boolean containsValue(Object value)
若Map含有指定的value值,返回true。
Throws:
ClassCastException - 如果value類型不適用這個映射(可選)
NullPointerException - 如果指定的value為空,並且此映射不允許為null(可選)
5、V get(Object key)
返回指定的key鍵所映射的value;
如果Map不包含這個key的映射,返回null
若該map允許為null的value,那么返回得到一個null值時,並不能確定該map是否含有key的映射。此時利用containsKey()區分。
6、V put(K key, V value)
將指定的value與這個map中的key關聯起來(可選操作)。
如果map中已經包含了該key的映射,則指定的value會取代原來的值。
此方法返回key原來映射到的值,當map中不存在該key的映射時,返回null(當然,如果允許value為null,那也許原來的映射值就為value)。
7、V remove(Object key)
如果指定的key在map中存在,移除它的映射。(可選操作)
返回key映射到的value,但如果不包含指定key的映射,返回空。(考慮該map是否允許value值為null)
一旦調用返回,映射將不包含指定key的映射
8、void putAll (Map<? extends K,? extends V> m)
從指定的map m中拷貝所有的映射到這個map中。(可選)
如果在操作過程中,指定的map m被修改了,則此操作的結果未定義。
9、void clear()
把一個map清空。(可選)
10、Set<K> keySet()
返回包含了該map中key鍵的Set視圖。
這個set視圖由該map支持,因此map的更改會反映在這個Set視圖中,反之亦然(對Set視圖的更改也會改變map???)。
Set視圖支持通過 Iterator.remove、Set.remove()、removeAll()、retainAll()和clear()操作來刪除元素,這將從映射中移除對應的映射。但是Set視圖不支持add()、addAll()操作。
如果正在在Set視圖上進行迭代操作時,map被修改了(除了迭代器的remove操作),這時的結果的不可預知的。
11、Collection<V> values()
返回一個包含該map中的value值的Collection視圖。
這個Collection視圖由該map支持,因此map的更改會反映在這個Set視圖中,反之亦然。
Collection視圖支持 Iterator.remove、Collection.remove、removeAll、retainAll和clear操作。不支持add和addAll操作。
同情況下,結果不可預知~
12、Set<Map.Entry<K,V>> entrySet()
返回一個該map的映射的Set視圖。
這個set視圖由該map支持,因此map的更改會反映在這個Set視圖中,反之亦然。
如果正在在Set視圖上進行迭代操作時,map被修改了(除了迭代器的remove操作,or through the setValue operation on a map entry returned by the iterator),這時的結果的不可預知的。
Set視圖支持通過 Iterator.remove、Set.remove()、removeAll()、retainAll()和clear()操作來刪除元素,這將從映射中移除對應的映射。但是Set視圖不支持add()、addAll()操作。
13、boolean equals(Object o)
如果指定的o也是一個map,且和該map有完全一樣的映射,返回true。
怎么定義兩個map m1和m2有完全一樣的映射呢?
if m1.entrySet().equals(m2.entrySet())
這樣也保證了equals()方法在Map的不同實現類之間有效地作用。
14、int hashcode()
一個map的hash code被定義為:the sum of the hash codes of each entry in the map's entrySet() view.
這意味着兩個equals的map的hashcode也是一樣的。
15、default V getOrDefault(Object key, V defaultValue)
16、default void forEach(BiConsumer<? super K,? super V> action)
17、default void replaceAll(BiFunction<? super K,? super V,? extends V> function)
18、default boolean remove(Object key, Object value)
19、default replace(K key, V oldValue, V newValue)
20、default V replace(K key, V value)
(還有幾個,不列了…)