java入門學(xué)習(xí)提升第十九篇:Java容器類詳解(二)Map接口

上一篇里介紹了容器家族里的大族長(zhǎng)——Collection接口炬守,今天來看看容器家族里的二族長(zhǎng)——Map接口涛救。

Map也是容器家族的一個(gè)大分支畏邢,但里面的元素都是以鍵值對(duì)(key-value)的形式存放的,就像字典一樣州叠,用相應(yīng)的key就可以拿到相應(yīng)的value棵红。

先來看看Map接口的內(nèi)容,下面是閹割版的Map接口(去掉了default method)咧栗,去掉的部分涉及Stream操作逆甜,屬于Map的高級(jí)用法虱肄,所以暫時(shí)不做介紹。

import java.io.Serializable;

import java.util.Collection;

import java.util.Comparator;

import java.util.Objects;

import java.util.Set;

public interface Map {

// 查詢操作

/**

* 返回鍵值對(duì)數(shù)量

*/

int size();

/**

* Map是否為空

*/

boolean isEmpty();

/**

* Map中是否包含指定的key

*/

boolean containsKey(Object key);

/**

* Map中是否包含指定的value

*/

boolean containsValue(Object value);

/**

* 根據(jù)key獲取對(duì)應(yīng)的value

*/

V get(Object key);

// Modification Operations

/**

* 插入鍵值對(duì)交煞,如果Map中已經(jīng)存在該key咏窿,則新的value會(huì)覆蓋原來的value

*/

V put(K key, V value);

/**

* 移除指定key對(duì)應(yīng)的鍵值對(duì)素征,并返回相應(yīng)的value

*/

V remove(Object key);

// 批量操作

/**

* 將另一個(gè)Map中的鍵值對(duì)全部復(fù)制過來

*/

void putAll(Map m);

/**

* 移除所有鍵值對(duì)

*/

void clear();

// 視圖

/**

* 返回包含Map中所有key的(Set類型)鍵視圖集嵌,對(duì)Map的修改也會(huì)影響到鍵視圖

*/

Set keySet();

/**

* 返回包含Map中所有value的(Collection類型)值視圖,對(duì)Map的修改也會(huì)影響到值視圖

*/

Collection values();

/**

* 返回包含Map中所有鍵值對(duì)的(java.util.Map.Entry類型)鍵值對(duì)視圖

*/

Set> entrySet();

/**

* Map 鍵值對(duì)接口

*/

interface Entry {

/**

* 返回鍵

*/

K getKey();

/**

* 返回值

*/

V getValue();

/**

* 設(shè)置鍵

*/

V setValue(V value);

boolean equals(Object o);

int hashCode();

/**

* 鍵比較器(內(nèi)部比較器)

*/

public static , V> Comparator> comparingByKey() {

return (Comparator> & Serializable)

(c1, c2) -> c1.getKey().compareTo(c2.getKey());

}

/**

* 值比較器(內(nèi)部比較器)

*/

public static > Comparator> comparingByValue() {

return (Comparator> & Serializable)

(c1, c2) -> c1.getValue().compareTo(c2.getValue());

}

/**

* 鍵比較器(外部比較器)

*/

public static Comparator> comparingByKey(Comparator cmp) {

Objects.requireNonNull(cmp);

return (Comparator> & Serializable)

(c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());

}

/**

* 值比較器(外部比較器)

*/

public static Comparator> comparingByValue(Comparator cmp) {

Objects.requireNonNull(cmp);

return (Comparator> & Serializable)

(c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());

}

}

// 比較和散列

boolean equals(Object o);

int hashCode();

}

可以看到根欧,Map接口的內(nèi)容凤粗,其實(shí)比Collection接口更豐富,這里因?yàn)槭÷粤撕芏喔呒?jí)方法,而且里面包含了另外一個(gè)接口灰瞻,Map.Entry接口袍祖,也就是一直所說的鍵值對(duì),這個(gè)接口是Map中元素需要實(shí)現(xiàn)的接口。

Map有三種遍歷方式:1.通過遍歷KeySet來遍歷所有鍵值對(duì)凳鬓,2.通過遍歷EntrySet來實(shí)現(xiàn),3.通過EntrySet的Iterator來遍歷仅孩。這里還有一個(gè)新概念——視圖辽慕,視圖其實(shí)就是一個(gè)集合京腥,但是是一個(gè)不能修改的集合,只能對(duì)視圖進(jìn)行查詢和遍歷操作,在Map中一共有三個(gè)視圖,鍵視圖人灼,值視圖投放,鍵值對(duì)視圖,下面可以看一個(gè)小栗子:

public class Test {

public static void main(String[] args){

Map map = new HashMap<>();

map.put(1,11);

map.put(2,22);

map.put(3,33);

Set keys = map.keySet();

Collection values = map.values();

Set> entries = map.entrySet();

Iterator> iterator = entries.iterator();

System.out.println(keys);

System.out.println(values);

System.out.println(entries);

System.out.println("按keyset遍歷");

for (Integer key : keys){

System.out.println("key:" + key + " value:" + map.get(key));

}

System.out.println("按鍵值對(duì)遍歷");

for (Map.Entry entry : entries){

System.out.println("entry:" + entry);

}

System.out.println("按iterator遍歷");

while (iterator.hasNext()){

Map.Entry entry = iterator.next();

System.out.println("entry:" + entry);

}

map.put(2,444);

map.put(4,44);

System.out.println("修改后的視圖");

System.out.println(keys);

System.out.println(values);

System.out.println(entries);

keys.add(5);

values.add(55);

}

}

輸出如下:

[1, 2, 3]

[11, 22, 33]

[1=11, 2=22, 3=33]

按keyset遍歷

key:1 value:11

key:2 value:22

key:3 value:33

按鍵值對(duì)遍歷

entry:1=11

entry:2=22

entry:3=33

按iterator遍歷

entry:1=11

entry:2=22

entry:3=33

修改后的視圖

[1, 2, 3, 4]

[11, 444, 33, 44]

[1=11, 2=444, 3=33, 4=44]

Exception in thread "main" java.lang.UnsupportedOperationException

at java.util.AbstractCollection.add(AbstractCollection.java:262)

at com.frank.chapter19.Test.main(Test.java:44)

栗子里介紹了三種遍歷方式裸准,也看到了三種視圖的樣子权悟,當(dāng)我們?cè)噲D修改視圖時(shí),拋出了一個(gè)UnsupportedOperationException異常,表明該視圖集合無法修改。

在Map.Entry接口里,還可以看到外部比較器和內(nèi)部比較器,這兩個(gè)概念暫時(shí)也不做介紹,在之后的文章里會(huì)介紹。

關(guān)于Map,要說的主要就這么多了,目前來說只需要知道Map是以鍵值對(duì)的形式進(jìn)行存取,并了解Map接口中的主要方法及其作用,了解Map的遍歷方法,和視圖的概念就已經(jīng)足夠了。

本篇到此結(jié)束,歡迎大家繼續(xù)關(guān)注。

我做開發(fā)十多年的時(shí)間,如果大家對(duì)于學(xué)習(xí)java的學(xué)習(xí)方法瘩将,學(xué)習(xí)路線以及你不知道自己應(yīng)該是自學(xué)還是培訓(xùn)的疑問,都可以隨時(shí)來問我备典,大家可以加我的java交流學(xué)習(xí)qun:四九四镐依,八零一槐壳,九三一枫笛,qun內(nèi)有學(xué)習(xí)教程以及開發(fā)工具吠冤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遭赂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌靖避,老刑警劉巖谐岁,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異织咧,居然都是意外死亡艇搀,警方通過查閱死者的電腦和手機(jī)焰雕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但两,“玉大人,你說我怎么就攤上這事悲关『蕉幔” “怎么了冷蚂?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)调卑。 經(jīng)常有香客問我抡砂,道長(zhǎng),這世上最難降的妖魔是什么恬涧? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任注益,我火速辦了婚禮,結(jié)果婚禮上溯捆,老公的妹妹穿的比我還像新娘丑搔。我一直安慰自己,他們只是感情好提揍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布啤月。 她就那樣靜靜地躺著,像睡著了一般劳跃。 火紅的嫁衣襯著肌膚如雪谎仲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天刨仑,我揣著相機(jī)與錄音郑诺,去河邊找鬼夹姥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辙诞,可吹牛的內(nèi)容都是我干的辙售。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼倘要,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼圾亏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起封拧,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤志鹃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泽西,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曹铃,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捧杉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陕见。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡味抖,死狀恐怖评甜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仔涩,我是刑警寧澤忍坷,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站熔脂,受9級(jí)特大地震影響佩研,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜霞揉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一旬薯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧适秩,春花似錦绊序、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚂会,卻和暖如春淋样,著一層夾襖步出監(jiān)牢的瞬間耗式,已是汗流浹背胁住。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工趁猴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彪见。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓儡司,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親余指。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捕犬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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