HashMap遍历
夯实基础,震惊面试官一整年。
一、概述
共有4类7种方法,如下图所示:
二、遍历方式
-
Iterator + EntrySet
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); 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()); } } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
Iterator + KeySet
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); Iterator<Integer> iterator = map.keySet().iterator(); while (iterator.hasNext()){ Integer key = iterator.next(); System.out.println(key + ", " + map.get(key)); } } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
ForEach + EntrySet
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); for(Map.Entry<Integer, String> entry : map.entrySet()){ System.out.println(entry.getKey() + ", " + entry.getValue()); } } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
ForEach + KeySet
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); for(Integer key : map.keySet()){ System.out.println(key + ", " + map.get(key)); } } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
Lambda
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); map.forEach((key, value) -> { System.out.println(key + ", " + value); }); } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
Streams API单线程
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); map.entrySet().stream().forEach((entry) -> { System.out.println(entry.getKey() + ", " + entry.getValue()); }); } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
-
Streams API多线程
public class PrintHashMap { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Hello, World!"); map.put(2, "Hi, Java!"); map.put(3, "你好, Spring!"); map.put(4, "芜湖,起飞。"); map.entrySet().parallelStream().forEach((entry) -> { System.out.println(entry.getKey() + ", " + entry.getValue()); }); } } //打印结果 1, Hello, World! 2, Hi, Java! 3, 你好, Spring! 4, 芜湖,起飞。
三、总结
- 在性能方面,Streams API多线程要较其他遍历方式更高效些,其余方法差别不是很大【未经合理测试,个人经验仅供参考】。
- 在安全性方面,在遍历中进行删除操作时,推荐使用迭代器的remove()方法,或者使用Lambda的removeIf()方法,不建议在遍历过程中使用map集合的remove()方法。