Map 源碼注釋
開始的第一行就直接說明了 Map 每一個(gè) Key 對(duì)應(yīng)一個(gè) Value 然后 Key 是不允許重復(fù)的。他是一個(gè)完全抽象的類而不是一個(gè)接口卧惜,它代替類 Dictionary 類雇盖。Map 接口提供了三個(gè)集合視圖忿等,允許 map 的內(nèi)容被視為一組鍵栖忠、值的集合崔挖,或一組鍵值的映射贸街。Map 的順序被定義為 Map 集合視圖上的迭代器返回其元素的順序。一些 Map 的實(shí)現(xiàn)狸相,比如 TreeMap 類薛匪,對(duì)它們的順序做了特定的保證;而例如 HashMap 類脓鹃,則沒有逸尖。
Note:如果可變對(duì)象被用作 Map 的鍵,則必須非常小心瘸右。如果對(duì)象的值以影響 equals 比較的方式改變娇跟,而對(duì)象是映射中的鍵,則不會(huì)指定映射的行為太颤。這種禁令的一個(gè)特例就是地圖不能包含自己作為關(guān)鍵字苞俘。但是允許映射包含自己的值,但是要特別小心:在此類映射上龄章, equals 和 hashCode 方法不再被很好地定義吃谣。
所有實(shí)現(xiàn)了 Map 接口的具有一般用途的類都應(yīng)該提供兩種“標(biāo)準(zhǔn)”的構(gòu)造函數(shù):(1)一個(gè)用來創(chuàng)造一個(gè)空的 Map 的無參構(gòu)造函數(shù)(void constructor);(2)一個(gè)帶有 Map 類型的單個(gè)參數(shù)的構(gòu)造函數(shù)做裙,它創(chuàng)建一個(gè)具有與其參數(shù)相投的 鍵-值 映射的新映射岗憋。實(shí)際上,后者的構(gòu)造函數(shù)允許用戶復(fù)制任何 Map锚贱,生成所需類的等價(jià) Map仔戈。雖然 Map 沒有辦法執(zhí)行這個(gè)建議(因?yàn)榻涌诓荒馨瑯?gòu)造函數(shù)),但是 JDK 中的所有通用映射實(shí)現(xiàn)都符合拧廊。
如果 Map 不支持這個(gè)操作杂穷,即包含在這個(gè)接口中“破壞性”的方法,也就是修改它們所在的 Map 的方法卦绣,那么就會(huì)指定拋出一個(gè) UnSupportedOperationException異常耐量。如果是這種情況,調(diào)用這些方法(但不是必須的)對(duì) Map 沒有影響可能拋出一個(gè) UnSupportedOperationException異常滤港。例如廊蜒,在不可修改的映射上調(diào)用 putAll(Map),如果映射的“疊加”映射是空的溅漾,可能(但不是必須)拋出異常山叮。
實(shí)現(xiàn) Map 接口的一些類對(duì)它們可能包含的鍵和值有限制。例如添履,一些可能會(huì)禁止空的 Key 和 values屁倔,一些會(huì)限制它們 keys 的類型。試圖插入一個(gè)不合格的 key 或 value 會(huì)拋出一個(gè)未經(jīng)檢查的異常暮胧,一般是
NullPointerException 或 ClassCastException锐借。試圖查詢一個(gè)不合格的 key 和 value 的存在可能會(huì)拋出一個(gè)異常问麸,或是簡單的返回 false。一些實(shí)現(xiàn)將展現(xiàn)前者的行為钞翔,一些將展現(xiàn)后者的行為严卖。一般來說,嘗試對(duì)不合格的鍵值來進(jìn)行操作布轿,其操作的完成不會(huì)導(dǎo)致將不合格的元素插入到映射中可能會(huì)引發(fā)異常哮笆,或者可能會(huì)成功執(zhí)行。這個(gè)例外在這個(gè)接口的規(guī)范中被標(biāo)記為“可選的”汰扭。
集合框架接口中的許多方法是根據(jù)等效方法定義的稠肘,例如,{@link #containsKey(Object)containsKey(Object key)}方法的規(guī)范說:“返回true”當(dāng)且僅當(dāng)這個(gè)映射包含一個(gè)關(guān)鍵字的映射 (key == null萝毛?k == null:key.equals(k))启具。這個(gè)規(guī)范不應(yīng)該被解釋為暗示用一個(gè)非空參數(shù)<key>調(diào)用 Map.containsKey 會(huì)導(dǎo)致key.equals( k)被調(diào)用的任何鍵 k 。實(shí)現(xiàn)可以自由地實(shí)現(xiàn)優(yōu)化珊泳,從而避免了 equals 調(diào)用鲁冯,例如通過首先比較兩個(gè)鍵的哈希碼。({@link Object#hashCode()}規(guī)范保證了哈希碼不相等的兩個(gè)對(duì)象不能相等色查。)更一般地說薯演,各種集合框架接口的實(shí)現(xiàn)可以自由地利用實(shí)現(xiàn)者認(rèn)為適當(dāng)?shù)娜魏蔚讓臃椒ǖ闹付ㄐ袨椤?br>
執(zhí)行映射遞歸遍歷的某些映射操作可能會(huì)失敗,并且映射直接或間接包含自身的自我引用實(shí)例秧了。這包括clone()跨扮,equals(),hashCode()和toString()方法验毡。實(shí)現(xiàn)可以選擇處理自引用場景衡创,然而大多數(shù)當(dāng)前的實(shí)現(xiàn)不這樣做。
- @author Josh Bloch
- @see HashMap
- @see TreeMap
- @see Hashtable
- @see SortedMap
- @see Collection
- @see Set
Map 的函數(shù)(public interface Map<K,V>)
查詢操作
int size():返回此映射中鍵值的映射數(shù)量,如果超過 Integer.MAX_VALUE 則返回 Integer.MAX_VALUE
boolean isEmpty():如果此映射不包含鍵值映射晶通,則返回 true
boolean containsKey(Object key):如果這個(gè)映射包含指定鍵的映射璃氢,則返回 true
boolean containsValue(Object value):如果此映射將一個(gè)或多個(gè)鍵映射到指定的值,則返回 true狮辽。
V get(Object key):返回指定的鍵映射到的值一也;如果此映射不包含鍵的映射,則返回 null
修改操作
V put(K key,V value):將指定的值與此 Map 中指定的鍵相關(guān)聯(lián)(可選操作)喉脖。如果 Map 以前包含一個(gè)映射鍵椰苟,則舊值被指定的值替換.
V remove(Object key):如果存在,則從該映射中除去該映射
批量操作
void putAll(Map<?extends K,? extends V> m):將指定映射的所有映射復(fù)制到此映射树叽。 m 映射被存儲(chǔ)在這個(gè)映射中舆蝴。
void clear():從該映射中刪除所有映射,執(zhí)行該方法后,Map 將為空洁仗。
查看(Views)
Set<K> keySet():返回一個(gè)包含在此映射中的鍵的集合視圖.
Collection<V> values():返回該 Map 中包含的值的集合視圖
Set<Map.Entry<K,V>> entrySet():返回此映射中包含的映射的 Set視圖
interface Entry<K,V>
Map.entrySet 方法返回地圖的集合視圖层皱,其元素是這個(gè)類的。獲取對(duì) Map 條目的引用的唯一方法是從這個(gè)集合視圖的迭代器中獲取京痢。
每個(gè) Map.Entry 其實(shí)就是一個(gè) key-value 對(duì).