热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java中遍历Map集合的多种方法

本文作者「航向未来」,热衷于技术分享与开源文化。本文将详细介绍Java中遍历Map集合的几种常见方式,并探讨其优缺点。

作者简介: 我是「航向未来」,一个热爱技术、开源文化和编程的开发者。我相信技术的力量能够改变世界,知识应当被自由地分享。如果你对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 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方法(即本文中的第五种方式),该方法不仅代码简洁,而且性能优良。

由于个人能力有限,本文可能存在不足之处,欢迎各位读者批评指正!


推荐阅读
  • Java Set集合源码深度解析
    本文将深入探讨Java集合框架中的Set接口及其主要实现类HashSet、LinkedHashSet和TreeSet的源码实现,帮助读者理解这些集合类的工作原理及应用场景。 ... [详细]
  • Java性能优化指南 | 制定有效的性能优化策略
    探讨Java应用性能优化的方法与策略,包括性能测试技巧、常见问题及解决方案,旨在帮助开发者提升系统性能。 ... [详细]
  • 本文深入探讨了在Java编程语言中,如何使用`org.apache.polygene.api.association.AssociationDescriptor.qualifiedName()`方法,并提供了多个实际应用的代码示例。这些示例源自GitHub、StackOverflow和Maven等知名平台,旨在帮助开发者更好地理解和应用这一方法。 ... [详细]
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 本文介绍了如何通过修改Discuz!NT源代码及其工具包DiscuzToolkit,实现在使用API回帖时能够指定用户ID(UID)。主要步骤包括扩展Reply类以支持UID字段,以及调整相关API接口来处理新的请求。 ... [详细]
  • 本文详细解析了muduo库中的Socket封装及字节序转换功能。主要涉及`Endian.h`和`SocketsOps.h`两个头文件,以及`Socket.h`和`InetAddress.h`类的实现。 ... [详细]
  • 利用Java与Tesseract-OCR实现数字识别
    本文深入探讨了如何利用Java语言结合Tesseract-OCR技术来实现图像中的数字识别功能,旨在为开发者提供详细的指导和实践案例。 ... [详细]
  • 使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解_java
    这篇文章主要介绍了使用java8API遍历过滤文件目录及子目录及隐藏文件示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • C#反射reflection
    C#shanzm目录简介引入1.新建类库2.类库的使用3.反射反射实例1反射实例2反射实例3简介反射(reflection)是什么?在《精通C#》中是这么说的“反射就是一个运行库发 ... [详细]
  • Struts2(六) 用Struts完成客户列表显示
    Struts完成客户列表显示所用的基础知识在之前的随笔中已经讲过。这篇是介绍如何使用Struts完成客户列表显示。下面是完成的代码执行逻辑图:抽取项目部分代码相信大家 ... [详细]
  • 最近在深入学习《数据结构与算法–JavaScript描述》一书,尝试通过npmjs.org寻找合适的库作为参考,但未能找到完全符合需求的资源。因此,决定自行实现一个字典数据结构,以便日后能够直接应用。 ... [详细]
  • php如何更改编码格式?
    php如何更改编码格式? ... [详细]
  • 优化 DropDownList 与 TextBox 的交互体验
    本文介绍了一种解决方案,通过在 DropDownList 前添加一个 TextBox 来提升用户体验。当选项过多时,用户可以通过在 TextBox 中输入关键词来快速定位并选择相应的选项。 ... [详细]
  • 本文探讨了Java 9中StackWalking API的一个特性——StackWalker.Option.SHOW_HIDDEN_FRAMES。通过实例分析,揭示了该选项在不同场景下的具体表现及其重要性。 ... [详细]
  • 如何在Java中使用ArrayList存储基本数据类型
    本文探讨了在Java编程语言中,如何利用ArrayList存储基本数据类型的方法。由于ArrayList本身仅支持存储对象类型,因此需要将基本数据类型转换为其对应的包装类形式进行存储。 ... [详细]
author-avatar
EGO-Underwear
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有