Java Map中常遇到的幾個(gè)問題

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

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

```//mapHashMap map = new HashMap<>();map.put(1,10);map.put(2,20);map.put(3,30);//key listArrayList keyList = new ArrayList<>(map.keySet());//value listArrayList valueList = new ArrayList<>(map.values());//key-value listArrayList> 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對map進(jìn)行排序

可以將Map.Entry放入一個(gè)list,然后自己實(shí)現(xiàn)Comparator來對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)對key進(jìn)行排序。

4. 根據(jù)value對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對為value-key對來用上面的3中的TreeMap方法對其排序十嘿。該方法不推薦。

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效率較低玩般。 如果對同步性或與遺留代碼的兼容性沒有任何要求,建議使用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();```

**如果你想學(xué)習(xí)Java工程化牢硅、高性能及分布式、高性能芝雪、深入淺出减余。性能調(diào)優(yōu)、Spring惩系,MyBatis位岔,Netty源碼分析和大數(shù)據(jù)等知識點(diǎn)可以來找我。

而現(xiàn)在我就有一個(gè)平臺可以提供給你們學(xué)習(xí)堡牡,讓你在實(shí)踐中積累經(jīng)驗(yàn)掌握原理抒抬。主要方向是JAVA架構(gòu)師。如果你想拿高薪晤柄,想突破瓶頸擦剑,想跟別人競爭能取得優(yōu)勢的,想進(jìn)BAT但是有擔(dān)心面試不過的芥颈,可以加我的Java架構(gòu)進(jìn)階群:554355695

注:加群要求

1惠勒、具有2-5工作經(jīng)驗(yàn)的,面對目前流行的技術(shù)不知從何下手浇借,需要突破技術(shù)瓶頸的可以加捉撮。

2、在公司待久了妇垢,過得很安逸巾遭,但跳槽時(shí)面試碰壁肉康。需要在短時(shí)間內(nèi)進(jìn)修、跳槽拿高薪的可以加灼舍。

3吼和、如果沒有工作經(jīng)驗(yàn),但基礎(chǔ)非常扎實(shí)骑素,對java工作機(jī)制炫乓,常用設(shè)計(jì)思想,常用java開發(fā)框架掌握熟練的献丑,可以加末捣。

4、覺得自己很牛B创橄,一般需求都能搞定箩做。但是所學(xué)的知識點(diǎn)沒有系統(tǒng)化,很難在技術(shù)領(lǐng)域繼續(xù)突破的可以加妥畏。

5.阿里Java高級大牛直播講解知識點(diǎn)邦邦,分享知識,多年工作經(jīng)驗(yàn)的梳理和總結(jié)醉蚁,帶著大家全面燃辖、科學(xué)地建立自己的技術(shù)體系和技術(shù)認(rèn)知!

6.小號加群一律不給過网棍,謝謝黔龟。**

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市确沸,隨后出現(xiàn)的幾起案子捌锭,更是在濱河造成了極大的恐慌,老刑警劉巖罗捎,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件观谦,死亡現(xiàn)場離奇詭異,居然都是意外死亡桨菜,警方通過查閱死者的電腦和手機(jī)豁状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倒得,“玉大人泻红,你說我怎么就攤上這事∠疾簦” “怎么了谊路?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長菩彬。 經(jīng)常有香客問我缠劝,道長潮梯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任惨恭,我火速辦了婚禮秉馏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱羡。我一直安慰自己萝究,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布锉罐。 她就那樣靜靜地躺著帆竹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脓规。 梳的紋絲不亂的頭發(fā)上馆揉,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音抖拦,去河邊找鬼塌计。 笑死荡陷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摄凡。 我是一名探鬼主播下面,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼复颈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沥割?” 一聲冷哼從身側(cè)響起耗啦,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎机杜,沒想到半個(gè)月后帜讲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椒拗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年似将,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚀苛。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡在验,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堵未,到底是詐尸還是另有隱情腋舌,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布渗蟹,位于F島的核電站块饺,受9級特大地震影響赞辩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刨沦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一诗宣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧想诅,春花似錦召庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徘禁,卻和暖如春诅诱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背送朱。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工娘荡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驶沼。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓炮沐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親回怜。 傳聞我的和親對象是個(gè)殘疾皇子大年,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

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