 java開發(fa):Map簡介
							時間:2019-04-22      來源:華清遠(yuan)見
							java開發(fa):Map簡介
							時間:2019-04-22      來源:華清遠(yuan)見 
							將(jiang)鍵映(ying)(ying)射到值的對(dui)象。一(yi)(yi)個(ge)(ge)(ge)映(ying)(ying)射不能包含(han)重(zhong)復(fu)的鍵;每個(ge)(ge)(ge)鍵最多只能映(ying)(ying)射到一(yi)(yi)個(ge)(ge)(ge)值。此接口取代 Dictionary 類(lei)(lei),后者完全(quan)是一(yi)(yi)個(ge)(ge)(ge)抽(chou)象類(lei)(lei),而不是一(yi)(yi)個(ge)(ge)(ge)接口。
Map 接(jie)口(kou)提供(gong)三種collection 視圖,允許以鍵(jian)集(ji)、值集(ji)或鍵(jian)-值映(ying)(ying)(ying)射(she)(she)關(guan)系集(ji)的(de)形式(shi)查(cha)看某(mou)個映(ying)(ying)(ying)射(she)(she)的(de)內容(rong)。映(ying)(ying)(ying)射(she)(she)順序 定義(yi)為迭代(dai)器在(zai)映(ying)(ying)(ying)射(she)(she)的(de) collection 視圖上返回其元素的(de)順序。某(mou)些映(ying)(ying)(ying)射(she)(she)實現(xian)可明確保證其順序,如 TreeMap 類;另一些映(ying)(ying)(ying)射(she)(she)實現(xian)則不保證順序,如HashMap 類。
注(zhu):將(jiang)可變對(dui)象用作(zuo)映(ying)(ying)射(she)鍵(jian)時(shi)必(bi)須(xu)格外(wai)小心。當對(dui)象是(shi)映(ying)(ying)射(she)中(zhong)某個(ge)鍵(jian)時(shi),如果以影響 equals 比較的(de)(de)方式(shi)更(geng)改了對(dui)象的(de)(de)值,則映(ying)(ying)射(she)的(de)(de)行為將(jiang)是(shi)不(bu)確定的(de)(de)。此項(xiang)禁止的(de)(de)一(yi)(yi)種特(te)殊(shu)情(qing)況是(shi)不(bu)允(yun)許(xu)(xu)某個(ge)映(ying)(ying)射(she)將(jiang)自(zi)身作(zuo)為一(yi)(yi)個(ge)鍵(jian)包(bao)含(han)。雖然允(yun)許(xu)(xu)某個(ge)映(ying)(ying)射(she)將(jiang)自(zi)身作(zuo)為值包(bao) 含(han),但請格外(wai)小心:在這樣的(de)(de)映(ying)(ying)射(she)上(shang) equals 和 hashCode 方法的(de)(de)定義將(jiang)不(bu)再是(shi)明確的(de)(de)。
	
所(suo)有(you)通(tong)用(yong)的映射(she)實(shi)現(xian)類(lei)(lei)應該提供兩個(ge)“標準的”構造(zao)方(fang)法(fa):一(yi)個(ge) void (無(wu) 參數)構造(zao)方(fang)法(fa),用(yong)于創(chuang)建空映射(she);一(yi)個(ge)是(shi)帶有(you)單(dan)個(ge) Map 類(lei)(lei)型參數的構造(zao)方(fang)法(fa),用(yong)于創(chuang)建一(yi)個(ge)與其參數具(ju)有(you)相同(tong)鍵-值映射(she)關系(xi)的新映射(she)。實(shi)際上,后(hou)一(yi)個(ge)構造(zao)方(fang)法(fa)允許(xu)用(yong)戶復制(zhi)任意(yi)映射(she),生成所(suo)需類(lei)(lei)的一(yi)個(ge)等價映射(she)。盡 管無(wu)法(fa)強制(zhi)執(zhi)行此建議(yi)(因為接口(kou)不能包含構造(zao)方(fang)法(fa)),但是(shi) JDK 中所(suo)有(you)通(tong)用(yong)的映射(she)實(shi)現(xian)都遵從(cong)它(ta)。
此(ci)接口中包(bao)含的“破(po)壞”方(fang)法(fa)可修(xiu)改(gai)其(qi)操作的映(ying)(ying)射(she),如(ru)(ru)果(guo)此(ci)映(ying)(ying)射(she)不(bu)(bu)支持該操作,這(zhe)些方(fang)法(fa)將拋出(chu) UnsupportedOperationException。如(ru)(ru)果(guo)是這(zhe)樣,那么在調用(yong)對映(ying)(ying)射(she)無(wu)效時(shi),這(zhe)些方(fang)法(fa)可以(但(dan)不(bu)(bu)要求)拋出(chu) UnsupportedOperationException。例(li)如(ru)(ru),如(ru)(ru)果(guo)某個不(bu)(bu)可修(xiu)改(gai)的映(ying)(ying)射(she)(其(qi)映(ying)(ying)射(she)關(guan)系(xi)是“重疊”的)為空,則對該映(ying)(ying)射(she)調用(yong) putAll(Map) 方(fang)法(fa)時(shi),可以(但(dan)不(bu)(bu)要求)拋出(chu)異常。
某些(xie)映(ying)射(she)實(shi)(shi)現(xian)對(dui)可(ke)能包含的(de)鍵(jian)和值有所限制。例如,某些(xie)實(shi)(shi)現(xian)禁止 null 鍵(jian)和值,另一(yi)(yi)些(xie)則(ze)(ze)對(dui)其(qi)鍵(jian)的(de)類型(xing)有限制。嘗試(shi)插入不(bu)合(he)(he)格的(de)鍵(jian)或(huo)值將拋出一(yi)(yi)個未(wei)經檢查(cha)(cha)的(de)異常(chang),通常(chang)是(shi)(shi) NullPointerException 或(huo) ClassCastException。試(shi)圖查(cha)(cha)詢(xun)是(shi)(shi)否存在不(bu)合(he)(he)格的(de)鍵(jian)或(huo)值可(ke)能拋出異常(chang),或(huo)者(zhe)返回 false;某些(xie)實(shi)(shi)現(xian)將表現(xian)出前一(yi)(yi)種(zhong)行(xing)為,而另一(yi)(yi)些(xie)則(ze)(ze)表現(xian)后一(yi)(yi)種(zhong)。一(yi)(yi)般來(lai)說,試(shi)圖對(dui)不(bu)合(he)(he)格的(de)鍵(jian)或(huo)值執行(xing)操作且該(gai)操作的(de)完成(cheng)不(bu)會(hui)導致不(bu)合(he)(he)格的(de)元(yuan)素被插入映(ying)射(she) 中(zhong)時(shi),將可(ke)能拋出一(yi)(yi)個異常(chang),也可(ke)能操作成(cheng)功(gong),這(zhe)(zhe)取決(jue)于實(shi)(shi)現(xian)本身。這(zhe)(zhe)樣的(de)異常(chang)在此(ci)接口的(de)規范中(zhong)標記為“可(ke)選”。
此接口(kou)是 Java Collections Framework 的成員。
Collections Framework 接口(kou)中的(de)(de)(de)很多方法是根據 equals 方法定(ding)義的(de)(de)(de)。例(li)如(ru),containsKey(Object key) 方法的(de)(de)(de)規(gui)范中寫道(dao):“當且僅當此映(ying)射包含針對(dui)滿足 (key==null ? k==null : key.equals(k)) 的(de)(de)(de)鍵(jian) k 的(de)(de)(de)映(ying)射關系時(shi),返(fan)回 true”。不 應將此規(gui)范解(jie)釋為(wei)(wei):調用(yong)具有非空參數 key 的(de)(de)(de) Map.containsKey 將導致對(dui)任(ren)意的(de)(de)(de)鍵(jian) k 調用(yong) key.equals(k)。實(shi)現(xian)(xian)可(ke)隨(sui)意進行優化(hua),以避免(mian)調用(yong) equals,例(li)如(ru),可(ke)首先比較兩(liang)(liang)個(ge)鍵(jian)的(de)(de)(de)哈希(xi)碼(ma)(Object.hashCode() 規(gui)范保證哈希(xi)碼(ma)不相等的(de)(de)(de)兩(liang)(liang)個(ge)對(dui)象(xiang)不會相等)。一般來說,只要實(shi)現(xian)(xian)者認(ren)為(wei)(wei)合(he)適,各種 Collections Framework 接口(kou)的(de)(de)(de)實(shi)現(xian)(xian)可(ke)隨(sui)意利用(yong)底層(ceng) Object 方法的(de)(de)(de)指定(ding)行為(wei)(wei)。
常用操作說明
void clear()
從此(ci)映射(she)中(zhong)移除所有映射(she)關系(xi)(可(ke)選操(cao)作)。
boolean containsKey(Object key)
如果此映射包(bao)含指定鍵的(de)映射關(guan)系,則返回 true。
boolean containsValue(Object value)
如果此映(ying)射將一個或多(duo)個鍵映(ying)射到指定(ding)值,則返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此(ci)映(ying)射中(zhong)包含的映(ying)射關系的 Set 視圖。
boolean equals(Object o)
比較指定(ding)的對(dui)象與此映射是(shi)否相等(deng)。
V get(Object key)
返回(hui)指定鍵(jian)(jian)所映(ying)(ying)射(she)的值;如果(guo)此映(ying)(ying)射(she)不(bu)包含該鍵(jian)(jian)的映(ying)(ying)射(she)關系,則(ze)返回(hui) null。
int hashCode()
返回此映射的哈希碼值。
boolean isEmpty()
如果此映(ying)射未包(bao)含鍵-值映(ying)射關系,則返回(hui) true。
Set<K> keySet()
返回(hui)此映射(she)中包(bao)含的鍵的 Set 視圖。
V put(K key, V value)
將(jiang)指定的值與此映射中的指定鍵關聯(可選操作)。
void putAll(Map<? extends K,? extends V> m)
從指定映(ying)射(she)中(zhong)將所有映(ying)射(she)關系復(fu)制到(dao)此映(ying)射(she)中(zhong)(可選操作)。
V remove(Object key)
如(ru)果存在一個鍵(jian)的映(ying)射關系,則將其從此映(ying)射中移(yi)除(chu)(可(ke)選(xuan)操作)。
int size()
返(fan)回(hui)此映射中的鍵-值映射關系(xi)數(shu)。
Collection<V> values()
返(fan)回此映射(she)中包含的值的 Collection 視圖(tu)。
Map的一般用(yong)法
1.聲明一個Map :
Map map = new HashMap();
2 .向map中放(fang)值 ,注意: map是key-value的(de)形式(shi)存放(fang)的(de),如:
map.put("sa","dd");
3 .從map中(zhong)取值 :
String str = map.get("sa").toString,
結果(guo)是: str = "dd'
4 .遍(bian)歷一(yi)個(ge)map,從(cong)中(zhong)取得key和value :
Map m= new HashMap();
for(Object obj : map.keySet()){
Object value = map.get(obj );
}

