Java Map循环指南

一、遍历Map的三种方法

Java中的Map是一种以键值对形式存储数据的容器,常用的实现类有HashMap、LinkedHashMap和TreeMap。遍历Map是我们在使用Map时最常遇到的问题之一,下面介绍三种常用的遍历方法。

1. 通过entrySet遍历

Map map = new HashMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

使用entrySet遍历时,先获取到Map的所有entry集合,然后遍历所有entry,通过entry的getKey和getValue方法获取键值对。

2. 通过keySet遍历

Map map = new HashMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Integer key : map.keySet()) {
    System.out.print(key + " ");
    System.out.println(map.get(key));
}

使用keySet遍历时,先获取到Map的所有key集合,然后遍历所有key,通过Map的get方法获取对应的值。

3. 通过values遍历

Map map = new HashMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (String value : map.values()) {
    System.out.println(value);
}

使用values遍历时,直接获取到Map的所有值的集合,然后遍历所有值。

二、如何遍历有序Map

有序Map是指像LinkedHashMap和TreeMap这样的实现类,能够按照某种顺序(通常是插入顺序或按照键的自然顺序)存储键值对。如何遍历这些有序Map呢?

其实原理和遍历HashMap一样,只是在创建实例时需要指定排序的方式。

1. LinkedHashMap

Map map = new LinkedHashMap(16, 0.75f, true);
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

在创建LinkedHashMap时,需要传入三个参数:initialCapacity(初始化容量)、loadFactor(负载因子)和accessOrder(排序方式)。accessOrder为true时表示按照访问顺序排序,为false时表示按照插入顺序排序。

2. TreeMap

Map map = new TreeMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " " + entry.getValue());
}

在创建TreeMap时,只需要像创建普通HashMap一样传入默认的初始化容量即可。

三、遍历Map的性能比较

不同的遍历方式对Map的性能有影响,下面通过实验来看看它们之间的性能差异。

实验代码如下:

Map map = new HashMap();
Random random = new Random();
for (int i = 0; i < 1000000; i++) {
    map.put(random.nextInt(1000000), "some value");
}

long start = System.currentTimeMillis();
for (Map.Entry entry : map.entrySet()) {
    // do nothing
}
long end = System.currentTimeMillis();
System.out.println("遍历entrySet耗时:" + (end - start) + "ms");

start = System.currentTimeMillis();
for (Integer key : map.keySet()) {
    // do nothing
}
end = System.currentTimeMillis();
System.out.println("遍历keySet耗时:" + (end - start) + "ms");

start = System.currentTimeMillis();
for (String value : map.values()) {
    // do nothing
}
end = System.currentTimeMillis();
System.out.println("遍历values耗时:" + (end - start) + "ms");

实验结果(遍历1000000个元素,单位:毫秒):

遍历entrySet耗时:14ms

遍历keySet耗时:16ms

遍历values耗时:33ms

从实验结果来看,通过entrySet遍历Map是最快的,而通过values遍历是最慢的。

四、如何在多线程环境下遍历Map

在多线程环境下使用Map时,遍历是一个非常常见的操作,但是需要注意线程安全问题。

如果只是读取操作,可以直接使用Java 8中的forEach方法,示例代码如下:

Map map = new ConcurrentHashMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

map.forEach((key, value) -> {
    System.out.println(key + " " + value);
});

如果同时存在读取和写入操作,可以使用并发安全的遍历方式,如下代码所示:

Map map = new ConcurrentHashMap();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

map.entrySet().parallelStream().forEach(entry -> {
    System.out.println(entry.getKey() + " " + entry.getValue());
});

使用parallelStream遍历Map时,底层会自动实现并发安全,处理速度也会更快。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/151583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-11 13:42
下一篇 2024-11-11 13:42

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • 运维Python和GO应用实践指南

    本文将从多个角度详细阐述运维Python和GO的实际应用,包括监控、管理、自动化、部署、持续集成等方面。 一、监控 运维中的监控是保证系统稳定性的重要手段。Python和GO都有强…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Python wordcloud入门指南

    如何在Python中使用wordcloud库生成文字云? 一、安装和导入wordcloud库 在使用wordcloud前,需要保证库已经安装并导入: !pip install wo…

    编程 2025-04-29
  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python小波分解入门指南

    本文将介绍Python小波分解的概念、基本原理和实现方法,帮助初学者掌握相关技能。 一、小波变换概述 小波分解是一种广泛应用于数字信号处理和图像处理的方法,可以将信号分解成多个具有…

    编程 2025-04-29
  • Python字符转列表指南

    Python是一个极为流行的脚本语言,在数据处理、数据分析、人工智能等领域广泛应用。在很多场景下需要将字符串转换为列表,以便于操作和处理,本篇文章将从多个方面对Python字符转列…

    编程 2025-04-29

发表回复

登录后才能评论