Java Map 的七個(gè)常見問題沦寂,你知道幾個(gè)学密?

1、將Map轉(zhuǎn)化成List

Map接口提供了三種collection:key set,value set 和 key-value set传藏,每一種都可以轉(zhuǎn)成List腻暮。如下:

//map

HashMap map = new HashMap<>();

map.put(1,10);

map.put(2,20);

map.put(3,30);

//key list

ArrayList keyList = new ArrayList<>(map.keySet());

//value list

ArrayList valueList = new ArrayList<>(map.values());

//key-value list

ArrayList> entryList = new ArrayList<>(map.entrySet());

2、迭代Map

最高效的遍歷map的每個(gè)entry的方法如下:

for (Map.Entry entry : map.entrySet()){

int key = (int) entry.getKey();

int value = (int) entry.getValue();

}

也可以使用iterator毯侦,特別是JDK 1.5之前哭靖。

Iterator itr = map.entrySet().iterator();

while(itr.hasNext()){

Map.Entry entry = itr.next();

int key = (int) entry.getKey();

int value = (int) entry.getValue();

}

3、根據(jù)key對(duì)map進(jìn)行排序

可以將Map.Entry放入一個(gè)list叫惊,然后自己實(shí)現(xiàn)Comparator來對(duì)list排序款青。

ArrayList> list = new ArrayList<>(map.entrySet());

Collections.sort(list, new Comparator>() {

@Override

public int compare(Map.Entry e1, Map.Entry e2) {

return e1.getKey().compareTo(e2.getKey());

}

});

可以使用SortedMap。SortedMap的一個(gè)實(shí)現(xiàn)類是TreeMap霍狰。TreeMap的構(gòu)造器可以接受一個(gè)Comparator參數(shù)抡草。如下:

SortedMap sortedMap = new TreeMap<>(new Comparator() {

@Override

public int compare(Integer k1, Integer k2) {

return k1.compareTo(k2);

}

});

sortedMap.putAll(map);

注:TreeMap默認(rèn)對(duì)key進(jìn)行排序蔗坯。

4、根據(jù)value對(duì)map進(jìn)行排序

ArrayList> list = new ArrayList<>(map.entrySet());

Collections.sort(list, new Comparator>() {

@Override

public int compare(Map.Entry e1, Map.Entry e2) {

return e1.getValue().compareTo(e2.getValue());

}

});

如果map中的value不重復(fù)腿短,可以通過反轉(zhuǎn)key-value對(duì)為value-key對(duì)來用上面的3中的TreeMap方法對(duì)其排序橘忱。該方法不推薦卸奉。

5、初始化一個(gè)不可變Map

正確的做法:

public class Test{

private static Map map1 = new HashMap<>();

static {

map1.put(8,9);

map1.put(88,99);

map1 = Collections.unmodifiableMap(map1);

}

}

錯(cuò)誤的做法:

public class Test{

private static final Map map1 = new HashMap<>();

static {

map1.put(8,9);

map1.put(88,99);

}

}

加了final只能確保不能 map1 = new凝颇,但是可以修改map1中的元素拧略。

6瘪弓、HashMap、TreeMap和HashTable的區(qū)別

Map接口有三個(gè)比較重要的實(shí)現(xiàn)類月褥,分別是HashMap、TreeMap和HashTable舀透。

TreeMap是有序的决左,HashMap和HashTable是無序的。

Hashtable的方法是同步的惑芭,HashMap的方法不是同步的继找。這是兩者最主要的區(qū)別。

這就意味著Hashtable是線程安全的幻锁,HashMap不是線程安全的边臼。HashMap效率較高,Hashtable效率較低岭接。

如果對(duì)同步性或與遺留代碼的兼容性沒有任何要求臼予,建議使用HashMap。

查看Hashtable的源代碼就可以發(fā)現(xiàn)窄锅,除構(gòu)造函數(shù)外半哟,Hashtable的所有 public 方法聲明中都有 synchronized關(guān)鍵字签餐,而HashMap的源碼中則沒有。

Hashtable不允許null值氯檐,HashMap允許null值(key和value都允許)

父類不同:Hashtable的父類是Dictionary,HashMap的父類是AbstractMap

Hashtable中hash數(shù)組默認(rèn)大小是11糯崎,增加的方式是 old*2+1。HashMap中hash數(shù)組的默認(rèn)大小是16沃呢,而且一定是2的指數(shù)。

7某抓、創(chuàng)建一個(gè)空的Map

如果希望該map為不可變的否副,則:

map = Collections.emptyMap();

否則:

map = new HashMap();

Java高架構(gòu)師崎坊、分布式架構(gòu)、高可擴(kuò)展曲尸、高性能打月、高并發(fā)、性能優(yōu)化柴淘、Spring boot为严、Redis、ActiveMQ第股、Nginx话原、Mycat、Netty涉馅、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻免費(fèi)獲取架構(gòu)群:854180697

群鏈接:加群鏈接

寫在最后:歡迎留言討論稚矿,加關(guān)注,持續(xù)更新桥爽!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钠四,一起剝皮案震驚了整個(gè)濱河市跪楞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朵耕,老刑警劉巖淋叶,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞檩,死亡現(xiàn)場離奇詭異,居然都是意外死亡熏迹,警方通過查閱死者的電腦和手機(jī)凝赛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門墓猎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毙沾,你說我怎么就攤上這事左胞。” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵乳愉,是天一觀的道長蔓姚。 經(jīng)常有香客問我慨丐,道長,這世上最難降的妖魔是什么备闲? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蓬痒,結(jié)果婚禮上狱掂,老公的妹妹穿的比我還像新娘亲轨。我一直安慰自己,他們只是感情好惦蚊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布蹦锋。 她就那樣靜靜地躺著晕粪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尚氛,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天属瓣,我揣著相機(jī)與錄音抡蛙,去河邊找鬼惋耙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的婿屹。 我是一名探鬼主播昂利,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼梯捕,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼傀顾!你這毒婦竟也來了短曾?” 一聲冷哼從身側(cè)響起嫉拐,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤婉徘,失蹤者是張志新(化名)和其女友劉穎盖呼,沒想到半個(gè)月后几晤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟹瘾,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憾朴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年魁衙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纯蛾。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绅作,到底是詐尸還是另有隱情俄认,我是刑警寧澤眯杏,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布岂贩,位于F島的核電站萎津,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞪慧。R本人自食惡果不足惜弃酌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一查蓉、第九天 我趴在偏房一處隱蔽的房頂上張望豌研。 院中可真熱鬧鹃共,春花似錦、人聲如沸霜浴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类溢。三九已至露懒,卻和暖如春懈词,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纺涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拧咳,地道東北人骆膝。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓掐暮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子养交,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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