Java中Map接口

Map 集合和 Collection 集合不同惩嘉,Map 集合是基于鍵(key)/值(value)的映射罢洲,Collection中的集合,元素是孤立存在的文黎,向集合中存儲元素采用一個(gè)個(gè)元素的方式存儲惹苗;Map中的集合,元素是成對存在的耸峭,每個(gè)元素由鍵與值兩部分組成桩蓉,通過鍵可以找對所對應(yīng)的值。Collection中的集合稱為單列集合劳闹,Map中的集合稱為雙列集合院究。需要注意的是洽瞬,Map中的集合不能包含重復(fù)的鍵,值可以重復(fù)业汰;每個(gè)鍵只能對應(yīng)一個(gè)值伙窃。

1、Map 集合特點(diǎn)

每個(gè)元素成對存在样漆,由鍵和值兩部分組成为障,通過鍵可以找到對應(yīng)的值

鍵(key值)不可重復(fù),值(value)可以重復(fù)放祟,一個(gè)value值可以和很多key值形成對應(yīng)關(guān)系鳍怨,每個(gè)建最多只能映射到一個(gè)值

兩個(gè) Map 接口的重要實(shí)現(xiàn)類:HashMap 類、LinkedHashMap 類

2跪妥、Map接口中的常用方法

get(Object key):獲取指定鍵(key)所對應(yīng)的值(value)

put(K key鞋喇,V value):將指定的鍵與值對應(yīng)起來,并添加到集合中

若指定的鍵(key)在集合中沒有骗奖,則沒有這個(gè)鍵對應(yīng)的值确徙,返回null,并把指定的鍵值添加到集合中

若指定的鍵(key)在集合中存在执桌,則返回值為集合中鍵對應(yīng)的值(該值為替換前的值)鄙皇,并把指定鍵所對應(yīng)的值,替換成指定的新值

remove(Object key):根據(jù)指定的鍵(key)刪除元素仰挣,返回被刪除元素的值(value)

public static void main(String[] args)

{

? ? //創(chuàng)建Map對象

? ? Map<String,String> M = new HashMap<>();

? ? //添加元素

? ? M.put("湯姆","Tom");

? ? M.put("提姆","Tim");

? ? M.put("瑞克","Rik");

? ? System.out.println(M);

? ? //根據(jù)指定的key獲取對應(yīng)的value

? ? System.out.println(M.get("湯姆"));

? ? //根據(jù)key刪除元素,會返回key對應(yīng)的value值

? ? String val = M.remove("提姆");

? ? System.out.println(val);

? ? System.out.println(M);

? ? //當(dāng)給Map中添加元素伴逸,會返回key對應(yīng)的原來的value值,若key沒有對應(yīng)的值,返回null

? ? System.out.println(M.put("湯姆","TTT"));? //Tom

? ? System.out.println(M);

}

3膘壶、Map 集合遍歷方式 keySet 方法

Map 集合中遍歷是通過鍵找值的方法來實(shí)現(xiàn)的错蝴,即:通過元素中的鍵,獲取鍵所對應(yīng)的值颓芭,步驟如下:

調(diào)用 Map 集合的方法 keySet顷锰,將所有的鍵(key值)存儲到Set集合中

遍歷 Set 集合,獲取出 Set 集合中的所有元素 ( Map 中的鍵(key值))

調(diào)用 Map 集合 get 方法亡问,通過鍵(key值)獲取到值(value值)

public static void main(String[] args)

{

? ? //創(chuàng)建Map集合并添加元素

? ? Map<Integer,String> M = new HashMap<>();

? ? M.put(1,"a");

? ? M.put(2,"b");

? ? M.put(3,"c");

? ? //1. 調(diào)用 Map 集合的方法 keySet官紫,將所有的鍵(key值)存儲到Set集合中

? ? Set<Integer> S = M.keySet();

? ? //2.遍歷 Set 集合,獲取出 Set 集合中的所有元素 ( Map 中的鍵(key值))

? ? Iterator<Integer> it = S.iterator();

? ? while (it.hasNext())

? ? {

? ? ? ? //獲取Map中的鍵

? ? ? ? Integer key = it.next();

? ? ? ? //3.調(diào)用 Map 集合 get 方法州藕,通過鍵(key值)獲取到值(value值)

? ? ? ? String value = M.get(key);

? ? ? ? System.out.println(key + "=" + value);

? ? }

}

當(dāng)然束世,也可以使用增強(qiáng)for

for(String key : map.keySet())

{

? ? Integer value = map.get(key);

? ? System.out.println(key+"="+value);

}

4、Map 集合 Entry 對象使用 entrySet 方法遍歷

在 Map 類設(shè)計(jì)時(shí)床玻,提供了一個(gè)嵌套接口:Entry毁涉。Entry將鍵值對的對應(yīng)關(guān)系封裝成了對象,即鍵值對對象锈死,這樣我們在遍歷 Map 集合時(shí)贫堰,就可以從每一個(gè)鍵值對(Entry)對象中獲取對應(yīng)的鍵與對應(yīng)的值穆壕。

Entry是Map的一個(gè)內(nèi)部接口,由Map的子類的內(nèi)部類實(shí)現(xiàn)严嗜,可以使用 Map 接口中的 entrySet 方法返回一個(gè) Entry 對象

interface Map{

? ? interface Entry{? ? ?

? ? }

}

Entry 對象特點(diǎn):

Entry是Map接口中提供的一個(gè)靜態(tài)內(nèi)部嵌套接口

相關(guān)方法

???? getKey()方法:獲取Entry對象中的鍵

???? getValue()方法:獲取Entry對象中的值

???? entrySet()方法:用于返回Map集合中所有的鍵值對(Entry)對象粱檀,以Set集合形式返回

Map 集合遍歷方式 entrySet 方法:

調(diào)用 Map 集合方法 entrySet() 將集合中的映射關(guān)系對象 Entrty 存儲到Set集合:Set<Entry <K,V> >

迭代 Set 集合

獲取出的 Set 集合的元素,是映射關(guān)系對象

通過映射關(guān)系對象方法 getKet, getValue 獲取鍵值對

public static void main(String[] args)

{

? ? //創(chuàng)建Map集合并存儲元素

? ? Map<Integer,String> M = new HashMap<>();

? ? M.put(1,"a");

? ? M.put(2,"b");

? ? M.put(3,"c");

? ? //1.調(diào)用 Map 集合方法 entrySet() 將集合中的映射關(guān)系對象 Entrty 存儲到Set集合:Set<Entry <K,V> >

? ? Set<Map.Entry<Integer,String>> S = M.entrySet();

? ? //2.迭代 Set 集合

? ? Iterator<Map.Entry<Integer,String>> it = S.iterator();

? ? while (it.hasNext())

? ? {

? ? ? ? //3.獲取出的 Set 集合的元素的映射關(guān)系對象

? ? ? ? Map.Entry<Integer,String> entry = it.next();

? ? ? ? //4.通過映射關(guān)系對象方法 getKet, getValue 獲取鍵值對

? ? ? ? Integer key = entry.getKey();

? ? ? ? String value = entry.getValue();

? ? ? ? System.out.println(key + "=" + value);

? ? }

}

5漫玄、HashMap 集合存儲自定義對象和遍歷

使用HashMap集合,存儲自定義的對象,這個(gè)自定義對象既可以作為鍵压彭,也可以作為值(注意要保證鍵的唯一性)

代碼實(shí)例(這里省略了Person類)

public static void main(String[] args)

{

? ? //創(chuàng)建Map集合用來存儲創(chuàng)建的對象

? ? Map<Integer,Person> M = new HashMap<>();

? ? M.put(1,new Person("Tom",18));

? ? M.put(2,new Person("Tim",19));

? ? M.put(3,new Person("Rik",20));

? ? //這里使用增強(qiáng)for進(jìn)行遍歷

? ? //1.使用keySet鍵找值方式遍歷

? ? for(Integer key : M.keySet())

? ? {

? ? ? ? Person value = M.get(key);

? ? ? ? System.out.println(key + "=" + value);

? ? }

? ? //2.使用entrySet 鍵值對方式遍歷

? ? for(Map.Entry<Integer,Person> entry : M.entrySet())

? ? {

? ? ? ? Integer key = entry.getKey();

? ? ? ? Person value = entry.getValue();

? ? ? ? System.out.println(key + "=" + value);

? ? }

}

當(dāng)給 HashMap 中存放自定義的對象時(shí)睦优,如果自定義對象作為鍵(key)存在,這時(shí)要保證對象唯一性壮不,必須將對象的 hashCode 和 equals 方法重寫

如果要保證 Map 中存放的 key 和取出的順序一致汗盘,可以使用 LinkedHashMap 集合來存儲

6、LinkedHashMap 的特點(diǎn)

LinkedHashMap繼承HashMap询一,能夠保證迭代的順序

public static void main(String[] args) {

LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();

link.put("1", "a");

link.put("13", "a");

link.put("15", "a");

link.put("17", "a");

System.out.println(link);

}

7隐孽、Hashtable 的特點(diǎn)

是 Map 接口實(shí)現(xiàn)類

底層數(shù)據(jù)結(jié)果哈希表,特點(diǎn)和 HashMap 是一樣的

Hashtable 是線程安全集合,運(yùn)行速度慢(HashMap 線程不安全健蕊,運(yùn)行速度快)

Hashtable 命運(yùn)和Vector是一樣的,從JDK1.2開始菱阵,被更先進(jìn)的 HashMap 取代

Hashtable 不允許存儲 null 值,null 鍵(HashMap 允許存儲 null 值缩功,null 鍵)

Hashtable的子類 Properties 比較常用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晴及,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫡锌,更是在濱河造成了極大的恐慌虑稼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势木,死亡現(xiàn)場離奇詭異蛛倦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啦桌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門溯壶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人震蒋,你說我怎么就攤上這事茸塞。” “怎么了查剖?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵钾虐,是天一觀的道長。 經(jīng)常有香客問我笋庄,道長效扫,這世上最難降的妖魔是什么倔监? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮菌仁,結(jié)果婚禮上浩习,老公的妹妹穿的比我還像新娘。我一直安慰自己济丘,他們只是感情好谱秽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摹迷,像睡著了一般疟赊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峡碉,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天近哟,我揣著相機(jī)與錄音,去河邊找鬼鲫寄。 笑死吉执,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的地来。 我是一名探鬼主播戳玫,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼靠抑!你這毒婦竟也來了量九?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤颂碧,失蹤者是張志新(化名)和其女友劉穎荠列,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體载城,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肌似,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诉瓦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片川队。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖睬澡,靈堂內(nèi)的尸體忽然破棺而出固额,到底是詐尸還是另有隱情,我是刑警寧澤煞聪,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布斗躏,位于F島的核電站,受9級特大地震影響昔脯,放射性物質(zhì)發(fā)生泄漏啄糙。R本人自食惡果不足惜笛臣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隧饼。 院中可真熱鬧沈堡,春花似錦、人聲如沸燕雁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拐格。三九已至率拒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間禁荒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工角撞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呛伴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓谒所,卻偏偏與公主長得像热康,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子劣领,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容