作者:EGO-Underwear | 来源:互联网 | 2024-12-05 19:38
作者简介: 我是「航向未来」,一个热爱技术、开源文化和编程的开发者。我相信技术的力量能够改变世界,知识应当被自由地分享。如果你对Java编程或算法设计感兴趣,欢迎关注我的博客,让我们一起成长。
前言: 在Java编程中,Map集合是一种非常重要的数据结构,用于存储键值对。本文将详细介绍如何在Java中遍历Map集合的五种方法,并分析各自的适用场景和性能差异。
文章目录
- 方式一:通过Map.keySet使用iterator遍历
- 方式二:通过Map.entrySet使用iterator遍历
- 方式三:通过Map.keySet直接遍历
- 方式四:通过For-Each迭代entries,使用Map.entrySet遍历
- 方式五:使用lambda表达式forEach遍历
- 总结
方式一:通过Map.keySet使用iterator遍历
@Test
public void testHashMap1() {
Map map = new HashMap<>();
map.put(1, "Java");
map.put(2, "数据库");
map.put(3, "Vue");
System.out.println(map);
// 通过Map.keySet使用iterator遍历key,然后通过key获取对应的value值
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
String value = map.get(key);
System.out.println("key = " + key + ", value = " + value);
}
}
结果:
{1=Java, 2=数据库, 3=Vue}
key = 1, value = Java
key = 2, value = 数据库
key = 3, value = Vue
方式二:通过Map.entrySet使用iterator遍历
@Test
public void testHashMap2() {
Map map = new HashMap<>();
map.put(1, "Java");
map.put(2, "数据库");
map.put(3, "Vue");
System.out.println(map);
// 通过Map.entrySet使用iterator遍历key和value
Iterator> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = entries.next();
System.out.println(entry);
}
}
结果:
{1=Java, 2=数据库, 3=Vue}
1=Java
2=数据库
3=Vue
方式三:通过Map.keySet直接遍历
@Test
public void testHashMap3() {
Map map = new HashMap<>();
map.put(1, "Java");
map.put(2, "数据库");
map.put(3, "Vue");
System.out.println(map);
// 通过Map.keySet直接遍历key,然后通过key获取对应的value值
for (Integer key : map.keySet()) {
System.out.println("key = " + key + ", value = " + map.get(key));
}
}
结果:
{1=Java, 2=数据库, 3=Vue}
key = 1, value = Java
key = 2, value = 数据库
key = 3, value = Vue
方式四:通过For-Each迭代entries,使用Map.entrySet遍历
@Test
public void testHashMap4() {
Map map = new HashMap<>();
map.put(1, "Java");
map.put(2, "数据库");
map.put(3, "Vue");
System.out.println(map);
// 通过For-Each迭代entries,使用Map.entrySet遍历key和value
for (Map.Entry entry : map.entrySet()) {
System.out.println("key = " + entry.getKey() + ", value = " + entry.getValue());
}
}
结果:
{1=Java, 2=数据库, 3=Vue}
key = 1, value = Java
key = 2, value = 数据库
key = 3, value = Vue
方式五:使用lambda表达式forEach遍历
@Test
public void testHashMap5() {
Map map = new HashMap<>();
map.put(1, "Java");
map.put(2, "数据库");
map.put(3, "Vue");
System.out.println(map);
// 使用lambda表达式forEach遍历
map.forEach((k, v) -> System.out.println("key = " + k + ", value = " + v));
}
forEach 源码:
default void forEach(BiConsumer super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch (IllegalStateException ise) {
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
从源码可以看出,这种方式是在传统迭代的基础上增加了一层封装,但使代码更加简洁明了,适合在JDK 8及更高版本中使用。
总结
推荐使用 entrySet 遍历 Map 类集合 KV(即本文中的第四种方式),因为这种方式只需遍历一次即可同时获取键和值,效率较高。相比之下,keySet方式需要两次遍历,先转换为Iterator对象,再从HashMap中获取对应的值。
如果是JDK 8及以上版本,建议使用Map.forEach方法(即本文中的第五种方式),该方法不仅代码简洁,而且性能优良。
由于个人能力有限,本文可能存在不足之处,欢迎各位读者批评指正!