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.小號加群一律不給過网棍,謝謝黔龟。**