Java 遍历 Map 的 5 种方式

news/2024/11/26 4:22:31/

https://www.cnblogs.com/shoufeng/p/11774640.html

目录

  • 1 通过 keySet() 或 values() 方法遍历
  • 2 通过 keySet 的 get(key) 获取值
  • 3 通过 entrySet 遍历
  • 4 通过迭代器 Iterator 遍历
  • 5 通过 Lambda 表达式遍历
  • 6 总结 - 遍历 Map 的实践建议
  • 版权声明

Java 中遍历 Map 有多种方法, 从最早的迭代器 Iterator, 到 JDK 5 开始支持的增强型 for 循环 —— 即 foreach, 再到 JDK 8 的 Lambda 表达式, 让我们一起来看下具体的用法及其优缺点.

1 通过 keySet() 或 values() 方法遍历

如果只需要获取 Map 的 key 或者 value, 通过 Map 的 keySet() 或 values() 方法无疑是最方便的:


public class TestMap {/*** Map 的扩容比较消耗性能, 因此若能确定存储数据的大小,* 在初始化时指定初始容量是一个不错的实践技巧*/private static Map<Integer, Integer> map = new HashMap<>(16);/** keySet 获取 key */public void testKeySet() {for (Integer key : map.keySet()) {System.out.println(key);}}/** values 获取 value */public void testValues() {for (Integer value : map.values()) {System.out.println(value);}}
}

2 通过 keySet 的 get(key) 获取值

如果需要同时获取 key 和 value, 可以通过先获取 key, 然后再通过 Map 的 get(key) 获取对应的 value.

注意: 该方法不是最优选择, 一般不推荐使用.

    /** keySet get(key) 获取key and value */public void testKeySetAndGetKey() {for (Integer key : map.keySet()) {System.out.println(key + ":" + map.get(key));}}

3 通过 entrySet 遍历

通过对 Map 的 entrySet 进行遍历, 也可以同时拿到 key 和 value.

该方法是最常用的遍历 Map 的方法, 大多情况下, 其性能要优于第2种.

  /** * entrySet 获取 key 和 value, Entry 是 Map 内部存储数据的逻辑容器*/ public void testEntry() {for (Map.Entry<Integer, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ":" + entry.getValue());}}

4 通过迭代器 Iterator 遍历

上面的几种遍历方法都用了增强型 for 循环 —— foreach, 这是 JDK 5 开始才有的特性.

foreach 的操作虽然看起来很简洁, 但有一个劣势: 遍历 Map 时, 如果改变其大小, 就会抛出并发修改异常. 但如果在遍历时只需要删除 Map 中的元素, 那就可以用 Iterator 的 remove() 方法删除元素:

    /** Iterator 获取 key 和 value */public void testIterator() {Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<Integer, Integer> entry = it.next();System.out.println(entry.getKey() + ":" + entry.getValue());// 删除元素// it.remove();}}

5 通过 Lambda 表达式遍历

JDK 8 提供了 Lambda 表达式支持, 其语法看起来更简洁, 可以同时拿到 key 和 value.

不过, 经过简单的测试, Lambda 表达式遍历 Map 的速度要低于 entrySet 遍历的方式, 所以更推荐用 entrySet 去遍历 Map.

    /** Lambda 获取key and value */public void testLambda() {map.forEach((key, value) -> {System.out.println(key + ":" + value);});}

6 总结 - 遍历 Map 的实践建议

(1) 如果只获取 key 或者 value, 推荐使用 keySet() 或 values() 方法;
(2) 如果需要同时获取 key 和value, 推荐使用 entrySet;
(3) 如果需要在遍历过程中删除元素, 推荐使用 Iterator;
(4) 如果需要在遍历过程中添加元素, 可以新建一个临时 Map 存放新增的元素, 遍历结束后, 再把临时 Map 添加到原 Map 中.


http://www.ppmy.cn/news/83455.html

相关文章

【2451. 差值数组不同的字符串】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串数组 words &#xff0c;每一个字符串长度都相同&#xff0c;令所有字符串的长度都为 n 。 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] &…

10 款最常用的Sketch在线插件!

Sketch 是一款高效、小巧的界面设计工具&#xff0c;在设计领域广受设计团队喜爱&#xff0c;帮助设计师创造了许多令人惊叹的作品。在使用 Sketch 时&#xff0c;辅助使用一些插件可以更高效地完成设计任务。Windows 也能用的「协作版 Sketch」即时设计&#xff0c;可作为网页…

Python竖版大屏 | 用pyecharts开发可视化的奇妙探索2

你好&#xff01;我是马哥python说&#xff0c;一名10年程序猿&#xff0c;正在试错用pyecharts开发可视化大屏的非常规排版。 以下&#xff0c;我用8种ThemeType展示的同一个可视化数据大屏&#xff0c;可视化主题是分析淄博烧烤现象。 1、SHINE主题 2、LIGHT主题 3、MACARO…

uniapp 实现手写签字组件

前言&#xff1a; 在移动应用中&#xff0c;手写签名是一项非常方便和实用的功能。本文将介绍如何使用 Uniapp 实现一个手写签字组件&#xff0c;并支持在 APP、小程序和 Web 应用中使用。 实现思路&#xff1a; 创建一个空白画布&#xff1b; 监听画布上的鼠标或触摸事件&a…

C++实现图—邻接矩阵,邻接表,深度遍历,广度遍历

目录 1.图的基本概念 2.图的存储结构 2.1邻接矩阵 2.2 邻接表 3.图的遍历 3.1广度优先遍历 3.2图的深度遍历 总结&#xff1a; 1.图的基本概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G (V,E),其中顶点集合V{x|x属于某个对象集}是有穷非空集合…

Nginx基础概念

一.nginx简介 1.什么是nginx&#xff1f; Nginx 是高性能的 HTTP 和反向代理的web服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上n…

电压放大器的主要指标有哪些方面

电压放大器是电子电路中常用的器件&#xff0c;在选择和评估电压放大器时&#xff0c;需要考虑以下几个主要指标&#xff1a; 输入电阻&#xff08;Input Resistor&#xff09;&#xff1a;输入电阻是指放大器输入端的电阻值&#xff0c;它反映了放大器将输入信号转换成输出信号…

工作记录------小镇做题家思考

工作记录------小镇做题家思考 今天看到一篇好文&#xff0c;关于小镇做题家成长的路程&#xff0c;失败与反思&#xff0c;很有感概。 记录下一些自己的思考。 寒门子弟与其他子弟的区别&#xff1a; 寒门子弟受限于家庭环境因素所带来的视野、认知限制。在进入大学&#xff…