Java:Map遍歷(li)
時間:2019-02-13 來源:華清遠見
1、Map
Map是Java中(zhong)一種(zhong)十(shi)分(fen)常(chang)(chang)用的(de)(de)(de)集合(he)類型(xing)(接口),主要實現類有HashMap、TreeMap等。Map通常(chang)(chang)用于(yu)存(cun)儲“鍵-值(key-value)”類型(xing)的(de)(de)(de)數(shu)據(ju)結構,比如我們(men)手(shou)機中(zhong)的(de)(de)(de)通訊錄(lu)“張三-13066668888”;或者股票代碼與股票名(ming)稱(cheng)“000858-五糧液”。 所以(yi)我們(men)可以(yi)形象(xiang)的(de)(de)(de)理解為Map中(zhong)保(bao)存(cun)了兩組(zu)數(shu)據(ju),一組(zu)是key,另一組(zu)是value。key非常(chang)(chang)類似于(yu)Set,它是不(bu)能重復的(de)(de)(de),也不(bu)確保(bao)按順(shun)序排列。value非常(chang)(chang)類似List,它可以(yi)有重復的(de)(de)(de)值,可以(yi)通過key來(lai)獲取對(dui)應的(de)(de)(de)value。
2、Map基本使(shi)用(yong)
Map提供put和get方法來存取數據,下面(mian)例(li)子以(yi)HashMap為例(li)演示Map基本的存取數據的方式:
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始(shi)化map對象
Map<Integer, String> map = new HashMap<>();
//往(wang)map對象(xiang)添加(jia)月(yue)份序(xu)號和(he)英文縮寫的鍵值對數據(ju)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//控(kong)制臺輸出整個map對象
System.out.println("map對象所有數據(ju): " + map);
//控制(zhi)臺(tai)輸出第(di)三月(yue)的英(ying)文縮寫
System.out.println("第3月是: " + map.get(3));
}
}
上例輸出結果如下(xia):
map對象所(suo)有數據: {1=Jan, 2=Feb, 3=Mar, 4=Apr, 5=May}
第3月(yue)是: Mar
由于(yu)Map是接口,所(suo)以(yi)初始化用了(le)它的實現類HashMap,給map對象賦值使(shi)用put方(fang)法(fa),第(di)一個參數(shu)是key,第(di)二(er)個參數(shu)是value。這(zhe)里要注意(yi):HashMap是可以(yi)用null作(zuo)為key的。
當直接輸出(chu)map對象時,從結果(guo)可(ke)以看出(chu),它重寫了(le)toString方法,把(ba)map中的(de)所有數據按key=value的(de)格式返回,每對鍵(jian)值對之間用(yong)逗(dou)號分隔。
當要獲取指定key的value時,使用get方(fang)法,參數為key。
3、Map遍歷(li)
上面例子中是在已(yi)知key的情(qing)況下,才能獲(huo)取(qu)其(qi)對應的value,如果(guo)不知道Map里有哪些(xie)key的情(qing)況下怎(zen)么辦呢?這時候就需要用到Map的遍(bian)歷(li)(li),Map也跟Array或(huo)List一(yi)樣具有遍(bian)歷(li)(li)的方法,通過遍(bian)歷(li)(li)能獲(huo)得每(mei)一(yi)個key、value或(huo)者key-value鍵值對。遍(bian)歷(li)(li)Map有如下幾種方式:
3.1、只遍歷key
當只需(xu)要(yao)獲取key列(lie)表,而不(bu)關心value時(shi)用此方式(shi)。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始(shi)化map對象(xiang)
Map<Integer, String> map = new HashMap<>();
//往(wang)map對象添加(jia)月(yue)份序(xu)號和(he)英文(wen)縮寫(xie)的鍵(jian)值(zhi)對數據
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//遍歷所有的key
for(Integer k : map.keySet()) {
System.out.println(k);
}
}
}
輸出(chu)結果如下(xia):
1
2
3
4
5
3.2、只遍(bian)歷value
當(dang)只需要獲取(qu)value列表,而不關心(xin)key時(shi)用此方(fang)式(shi)。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化(hua)map對象
Map<Integer, String> map = new HashMap<>();
//往map對象添加(jia)月份序(xu)號和英(ying)文縮(suo)寫的(de)鍵(jian)值對數據(ju)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//遍歷所有的value
for(String v : map.values()) {
System.out.println(v);
}
}
}
輸出結果(guo)如下:
Jan
Feb
Mar
Apr
May
3.3 遍歷Entry對象(xiang)
當既需(xu)要(yao)key,也需(xu)要(yao)value時(shi),使用此方式。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(dui)象(xiang)
Map<Integer, String> map = new HashMap<>();
//往map對象添加月份序號和英文縮寫的鍵(jian)值對數據
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//遍歷所(suo)有的(de)Entry(key和value)
for(Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
輸出結果如下(xia):
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.4 使用forEach方法(fa)加Lambda遍歷
這種方式(shi)也可同時(shi)遍歷key和value,但是使(shi)用到(dao)了Lambda表達式(shi),需(xu)要JDK1.8以上(shang)版本。推薦使(shi)用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始(shi)化map對象(xiang)
Map<Integer, String> map = new HashMap<>();
//往(wang)map對(dui)象添(tian)加月份序號和英文縮寫的鍵(jian)值對(dui)數據
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//使(shi)用forEach方法加Lambda遍歷
map.forEach((k, v)->System.out.println(k + ": " + v));
}
}
輸出(chu)結果如下:
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.5 使用Iterator遍歷
雖然這種方式也能得到(dao)正確結果(guo),但是過(guo)于復雜,有(you)多(duo)此一舉之嫌。不推薦使用(yong)!
package com.hqyj;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對象
Map<Integer, String> map = new HashMap<>();
//往map對象添加月份序(xu)號(hao)和英文縮(suo)寫的鍵值(zhi)對數據
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//使用(yong)Iterator遍(bian)歷
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
輸出結果如(ru)下:
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.6 通過(guo)key遍歷value
這種方式(shi)(shi)顯得不倫不類(lei),如果(guo)已知key要獲取(qu)單個value,直(zhi)接(jie)用(yong)get方法(fa);如果(guo)要獲取(qu)所有的(de)value,請(qing)用(yong)values方式(shi)(shi)遍歷。不推薦使(shi)用(yong)!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化(hua)map對(dui)象
Map<Integer, String> map = new HashMap<>();
//往map對(dui)象添加月份序號和英文縮寫的鍵值對(dui)數據
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//通過key遍歷value
for(Integer i : map.keySet()) {
System.out.println(map.get(i));
}
}
}
輸出(chu)結果如下:
Jan
Feb
Mar
Apr
May

