简介
在我们的开发过程中,经常在处理数据的时候,都会遇到遍历集合的情况,其中HashMap遍历会经常遇到,这里我结合所看到的资料,总结一下HashMap的遍历方式。
HashMap的遍历方式主要可以分为这几类
- 首先是迭代器(Iterator),这是也是最常用的方式;
迭代器中有两种遍历方式:EntrySet 和KeySet
- foreach遍历方式
foreach也有两种遍历方式:EntrySet 和KeySet
- Stream API方法
- Lambda 表达式——JDK8推荐
这里补充一下,在《阿里Java开发手册——泰山版》中有这样一段介绍:
【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.forEach方法。 正例:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。
示例
package com.example.demo.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @author: sunzhinan
* @create: 2020-08-02 00:54
* @description: HashMap遍历方式介绍
*/
public class TestHashMap {
private static HashMap<String,String> map = new HashMap<>();
static {
map.put("name", "sunzhinan");
map.put("age", "64");
map.put("mail", "xxxx@163.com");
}
/**
* foreach——entrySet方式
*/
public static void traverse1(){
// 遍历
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key : " + entry.getKey());
System.out.println("value : " + entry.getValue());
}
}
/**
* foreach——keySet方式
*/
public static void traverse2(){
// 遍历
for (String key : map.keySet()) {
System.out.println("key : " + key);
System.out.println("value : " + map.get(key));
}
}
/**
* Iterator——keySet方式
*/
public static void traverse3(){
Iterator<HashMap.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, String> entry = iterator.next();
System.out.println("key : " + entry.getKey());
System.out.println("value : " + entry.getValue());
}
}
/**
* Iterator——keySet方式
*/
public static void traverse4(){
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()){
String key = iterator.next();
System.out.println("key : " + key);
System.out.println("value : " + map.get(key));
}
}
/**
* Stream——stream()方法
*/
public static void traverse5(){
System.out.println("---- 1 ----");
map.entrySet().stream().forEach((entry)->{
System.out.println("key : " + entry.getKey());
System.out.println("value : " + entry.getValue());
});
System.out.println("---- 2 ----");
map.keySet().stream().forEach((key)->{
System.out.println("key : " + key);
System.out.println("value : " + map.get(key));
});
}
/**
* Stream——parallelStream()方法
*/
public static void traverse6(){
map.entrySet().parallelStream().forEach((entry)->{
System.out.println("key : " + entry.getKey());
System.out.println("value : " + entry.getValue());
});
}
/**
* Lambda表达式——JDK8推荐
*/
public static void traverse7(){
map.forEach((key,value)->{
System.out.println("key : " + key);
System.out.println("value : " + value);
});
}
public static void main(String[] args) {
System.out.println("---- ForEach entrySet ----");
traverse1();
System.out.println("---- ForEach keySet ----");
traverse2();
System.out.println("---- Iterator entrySet ----");
traverse3();
System.out.println("---- Iterator keySet ----");
traverse4();
System.out.println("---- Stream stream ----");
traverse5();
System.out.println("---- Stream parallelStream ----");
traverse6();
System.out.println("---- Lambda表达式 ----");
traverse7();
}
}