HashMap的7种遍历方式

news2024/10/1 1:20:37

目录

  • 1.JDK 8 之前的遍历
    • 1.1 EntrySet 遍历
    • 1.2 KeySet 遍历
    • 1.3 EntrySet 迭代器遍历
    • 1.4 KeySet 迭代器遍历
  • 2.JDK 8 之后的遍历
    • 2.1 Lambda 遍历
    • 2.2 Stream 单线程遍历
    • 2.3 Stream 多线程遍历
  • 3.总结

1.JDK 8 之前的遍历

1.1 EntrySet 遍历

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

在这里插入图片描述

1.2 KeySet 遍历

KeySet 的遍历方式是循环 Key 内容,再通过 map.get(key) 获取 Value 的值,具体实现如下:

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        for (String key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
    }

在这里插入图片描述
KeySet 性能问题
通过以上代码,我们可以看出使用 KeySet 遍历,其性能是不如 EntrySet 的,因为 KeySet 其实循环了两遍集合,第一遍循环是循环 Key,而获取 Value 有需要使用 map.get(key),相当于有循环了一遍集合,所以 KeySet 循环不能建议使用,因为循环了两次,效率比较低。

1.3 EntrySet 迭代器遍历

EntrySet 和 KeySet 除了以上直接循环外,我们还可以使用它们的迭代器进行循环,如 EntrySet 的迭代器实现代码如下:

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }

在这里插入图片描述

1.4 KeySet 迭代器遍历

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            System.out.println(key + ":" + map.get(key));
        }
    }

在这里插入图片描述

2.JDK 8 之后的遍历

在 JDK 8 之后 HashMap 的遍历就变得方便很多了,JDK 8 中包含了以下 3 种遍历方法:
使用 Lambda 遍历
使用 Stream 单线程遍历
使用 Stream 多线程遍历

2.1 Lambda 遍历

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        map.forEach((key, value) -> {
            System.out.println(key + ":" + value);
        });
    }

在这里插入图片描述

2.2 Stream 单线程遍历

Stream 遍历是先得到 map 集合的 EntrySet,然后再执行 forEach 循环,实现代码如下:

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        map.entrySet().stream().forEach((entry) -> {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        });
    }

在这里插入图片描述

2.3 Stream 多线程遍历

Stream 多线程的遍历方式和上一种遍历方式类似,只是多执行了一个 parallel 并发执行的方法,此方法会根据当前的硬件配置生成对应的线程数,然后再进行遍历操作,实现代码如下:

    public static void main(String[] args) {
        // 创建并赋值 hashmap
        HashMap<String, String> map = new HashMap() {{
            put("Java", " Java Value");
            put("MySQL", " MySQL Value");
            put("Redis", " Redis Value");
        }};

        // 循环遍历
        map.entrySet().stream().parallel().forEach((entry) -> {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        });
    }

3.总结

7 种 HashMap 的遍历方式,其中 JDK 8 之前主要使用 EntrySet 和 KeySet 的遍历方式,而 KeySet 的遍历方式性能比较低,一般不推荐使用。然而在 JDK 8 之后遍历方式就有了新的选择,可以使用比较简洁的 Lambda 遍历,也可以使用性能比较高的 Stream 多线程遍历。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/380802.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高压功率放大器在径向驻波型超声波电机研究中的应用

实验名称&#xff1a;大力矩径向驻波型超声波电机有限元分析与实验研究研究方向&#xff1a;超声电机测试目的&#xff1a;提出了一种大力矩径向驻波型超声波电机&#xff0c;在实现电机大力矩输出的同时保持结构紧凑的特点。首先设计并分析了电机的结构和工作原理&#xff0c;…

Biomod2 (上):物种分布模型预备知识总结

Biomod11.栅格数据处理1.1 读取一个栅格图片1.2 计算数据间的相关系数1.3 生成多波段的栅格图像1.4 修改变量名称1.4.1 计算多个变量之间的相关性2. 矢量数据处理2.1 提取矢量数据2.2 数据掩膜2.2 栅格计算2.3 拓展插件的使用3. 图表绘制3.1 遥感影像绘制3.2 柱状图分析图绘制3…

C语言循环控制语句Break,goto,continue语句讲解

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。 C 语言中 break 语句有以下两种用法&#xff1a; 当 break 语句出现在一个循环内时&#xff0c;循环会立即终止&#xff0c;且程序流将继续执行紧接着循环的下一条语句。 它可用于终止 switch 语句中的一个 …

【日志框架-笔记】深入浅出 Log4j,理论-源码-配置

log4j一、log4j 的概述及其入门程序入门程序二、日志输出的需要及PatternLayout类源码分析日志输出的需要PatternLayout类的源码分析三、Log4j 占位符的具体含义四、Log4j 配置文件实操如何对配置文件进行解析的&#xff1f;(LogManager的静态代码块&#xff09;实操五、自定义…

ClickHouse的架构与基本概念

一、ClickHouse的定义 ClickHouse是一个完全的列式分布式数据库管理系统(DBMS)&#xff0c;允许在运行时创建表和数据库&#xff0c;加载数据和运行查询&#xff0c;而无需重新配置和重新启动服务器&#xff0c;支持线性扩展&#xff0c;简单方便&#xff0c;高可靠性&#xf…

spring spring-boot @valid @NotNull @NotEmpty 基本校验使用以及 全局异常优化集成

valid NotNull NotEmpty 一套标准的基础校验&#xff0c;可以将校验注解和附带错误信息添加到请求入参上即可完成校验&#xff0c;可以去除简单的校验代码&#xff0c;节省一定的时间和代码量 Maven 依赖 spring-boot <dependency><groupId>org.springframewor…

【已解决】VM中安装的Ubuntu窗口太小、无法和Windows复制粘贴

按理说窗口都是铺满VM的&#xff0c;可是有时候安装Ubuntu之后发现小太了&#xff0c;就800*600&#xff08;4:3&#xff09; 1 窗口太小方法一 在桌面右键&#xff0c;打开display settings 调整resolution&#xff0c;选择你需要的即可&#xff0c;但是这样的调整不是很完…

结构体占用内存大小如何确定?-->结构体字节对齐 | C语言

目录 一、什么是结构体 二、为什么需要结构体 三、结构体的字节对齐 3.1、示例1 3.2、示例2 3.3、示例3 3.4、示例4 3.5、示例5 四、结构体字节对齐总结 一、什么是结构体 结构体是将不同类型的数据按照一定的功能需 求进行整体封装&#xff0c;封装的数据类型与大小均…

日期:Date,SimpleDateFormat常见API以及包装类

一.Date类 package com.gch.d1_date;import java.util.Date;/**目标:学会使用Date类处理时间,获取时间的信息*/ public class DateDemo1 {public static void main(String[] args) {// 1.创建一个Date类的对象:代表系统此刻日期时间对象Date d new Date();System.out.println(…

什么是pod类型

很久很久以前&#xff0c;C 语言统一了江湖。几乎所有的系统底层都是用 C 写的&#xff0c;当时定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等。然后只要碰到一串01010110010 之类的数据&#xff0c;编译器都可以正确的把它解…

做软件测试,如何才能实现月入20K?

听我的&#xff0c;测试想要月入20k。 首先你要去大厂&#xff0c;不在大厂起码也得在一线城市&#xff0c;北上广深。 二线城市的话成都、杭州最好。 不然的话想都不要想。 像我之前整理过成都的公司&#xff0c;除了字节跳动、蚂蚁金服、滴滴、美团、京东、平安、字节跳动…

超简单的计数排序!!

假设给定混乱数据为&#xff1a;3&#xff0c;0&#xff0c;1&#xff0c;3&#xff0c;6&#xff0c;5&#xff0c;4&#xff0c;2&#xff0c;1&#xff0c;9。 下面我们将通过使用计数排序的思想来完成对上面数据的排序。(先不谈负数) 计数排序 该排序的思路和它的名字一样…

Java——图像渲染

题目链接 leetcode在线oj题——图像渲染 题目描述 有一幅以 m x n 的二维整数数组表示的图画 image &#xff0c;其中 image[i][j] 表示该图画的像素值大小。 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。 为了完成…

互联网医院系统软件开发|互联网医院管理系统开发的好处

互联网医院一直是现在的热门行业&#xff0c;很多的医院已经开发了互联网医院&#xff0c;并且已经在良好的运行中&#xff0c;而有一些医院和企业正在开发中&#xff0c;或者打算开发互联网医院系统&#xff0c;其实这些企业和医院还是很有远见的&#xff0c;因为他们知道并了…

Swift 第三方 播放器AliyunPlayer(阿里云播放器)(源码)

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

卡尔曼滤波——一种基于滤波的时序状态估计方法

文章目录1. Kalman滤波及其应用2. Kalman原理公式推导&#xff1a;Step 1&#xff1a;模型建立Step 2&#xff1a;开始Kalman滤波Step 3&#xff1a;迭代滤波本文是对 How a Kalman filter works, in pictures一文学习笔记&#xff0c;主要是提炼核心知识&#xff0c;方便作者快…

已解决pip install wxPython模块安装失败

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …

如何用AST还原某音的JSVMP

1. 什么是JSVMP vmp简单来说就是将一些高级语言的代码通过自己实现的编译器进行编译得到字节码&#xff0c;这样就可以更有效的保护原有代码&#xff0c;而jsvmp自然就是对JS代码的编译保护&#xff0c;具体的可以看看H5应用加固防破解-JS虚拟机保护方案。 如何区分是不是jsv…

OpenFeign 切换HttpClient遇到的问题

背景 OpenFeign支持三种Http请求方式&#xff0c;默认情况下通过jdk中的HttpURLConnection向下游服务发起http请求&#xff08;详见下图&#xff0c;源码详见feign.Client.Default&#xff09;&#xff0c; 默认的Client 采用 HttpURLConnection&#xff0c; 这种是无法复用的…

为什么一定要做集成测试?

集成测试&#xff0c;我们都不陌生&#xff0c;几乎我们产品每天都在进行。但是我们真的有好好思考&#xff1a;为什么一定要做集成测试吗&#xff1f;只是为了简单的将“积木”搭起来就行&#xff0c;还是有什么其他的深意&#xff1f; 深意可能不一定会有&#xff0c;但是意…