當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > Java:Map遍歷
1、Map
Map是Java中一種十分常用的集合類型(接口),主要實(shí)現(xiàn)類有HashMap、TreeMap等。Map通常用于存儲(chǔ)“鍵-值(key-value)”類型的數(shù)據(jù)結(jié)構(gòu),比如我們手機(jī)中的通訊錄“張三-13066668888”;或者股票代碼與股票名稱“000858-五糧液”。 所以我們可以形象的理解為Map中保存了兩組數(shù)據(jù),一組是key,另一組是value。key非常類似于Set,它是不能重復(fù)的,也不確保按順序排列。value非常類似List,它可以有重復(fù)的值,可以通過(guò)key來(lái)獲取對(duì)應(yīng)的value。
2、Map基本使用
Map提供put和get方法來(lái)存取數(shù)據(jù),下面例子以HashMap為例演示Map基本的存取數(shù)據(jù)的方式:
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//控制臺(tái)輸出整個(gè)map對(duì)象
System.out.println("map對(duì)象所有數(shù)據(jù): " + map);
//控制臺(tái)輸出第三月的英文縮寫(xiě)
System.out.println("第3月是: " + map.get(3));
}
}
上例輸出結(jié)果如下:
map對(duì)象所有數(shù)據(jù): {1=Jan, 2=Feb, 3=Mar, 4=Apr, 5=May}
第3月是: Mar
由于Map是接口,所以初始化用了它的實(shí)現(xiàn)類HashMap,給map對(duì)象賦值使用put方法,第一個(gè)參數(shù)是key,第二個(gè)參數(shù)是value。這里要注意:HashMap是可以用null作為key的。
當(dāng)直接輸出map對(duì)象時(shí),從結(jié)果可以看出,它重寫(xiě)了toString方法,把map中的所有數(shù)據(jù)按key=value的格式返回,每對(duì)鍵值對(duì)之間用逗號(hào)分隔。
當(dāng)要獲取指定key的value時(shí),使用get方法,參數(shù)為key。
3、Map遍歷
上面例子中是在已知key的情況下,才能獲取其對(duì)應(yīng)的value,如果不知道Map里有哪些key的情況下怎么辦呢?這時(shí)候就需要用到Map的遍歷,Map也跟Array或List一樣具有遍歷的方法,通過(guò)遍歷能獲得每一個(gè)key、value或者key-value鍵值對(duì)。遍歷Map有如下幾種方式:
3.1、只遍歷key
當(dāng)只需要獲取key列表,而不關(guān)心value時(shí)用此方式。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
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);
}
}
}
輸出結(jié)果如下:
1
2
3
4
5
3.2、只遍歷value
當(dāng)只需要獲取value列表,而不關(guān)心key時(shí)用此方式。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
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);
}
}
}
輸出結(jié)果如下:
Jan
Feb
Mar
Apr
May
3.3 遍歷Entry對(duì)象
當(dāng)既需要key,也需要value時(shí),使用此方式。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//遍歷所有的Entry(key和value)
for(Map.Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
輸出結(jié)果如下:
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.4 使用forEach方法加Lambda遍歷
這種方式也可同時(shí)遍歷key和value,但是使用到了Lambda表達(dá)式,需要JDK1.8以上版本。推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//使用forEach方法加Lambda遍歷
map.forEach((k, v)->System.out.println(k + ": " + v));
}
}
輸出結(jié)果如下:
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.5 使用Iterator遍歷
雖然這種方式也能得到正確結(jié)果,但是過(guò)于復(fù)雜,有多此一舉之嫌。不推薦使用!
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對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//使用Iterator遍歷
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());
}
}
}
輸出結(jié)果如下:
1: Jan
2: Feb
3: Mar
4: Apr
5: May
3.6 通過(guò)key遍歷value
這種方式顯得不倫不類,如果已知key要獲取單個(gè)value,直接用get方法;如果要獲取所有的value,請(qǐng)用values方式遍歷。不推薦使用!
package com.hqyj;
import java.util.HashMap;
import java.util.Map;
public class LoopMap {
public static void main(String[] args) {
//初始化map對(duì)象
Map<Integer, String> map = new HashMap<>();
//往map對(duì)象添加月份序號(hào)和英文縮寫(xiě)的鍵值對(duì)數(shù)據(jù)
map.put(1, "Jan");
map.put(2, "Feb");
map.put(3, "Mar");
map.put(4, "Apr");
map.put(5, "May");
//通過(guò)key遍歷value
for(Integer i : map.keySet()) {
System.out.println(map.get(i));
}
}
}
輸出結(jié)果如下:
Jan
Feb
Mar
Apr
May