版权声明: 本文为转载文章, 转载时有适量修改. 再次转载时请附上原文出处链接和本声明.

作者:zhaoguhong(赵孤鸿)

出处:http://www.cnblogs.com/zhaoguhong

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 中.

版权声明

本文版权归原作者所有, 如有侵权, 请联系博主, 定当立即删除.

若要转载, 请在文章页面明显位置标明原始链接, 否则一切责任自负.

[转载] Java 遍历 Map 的 5 种方式的更多相关文章

  1. java 遍历Map的四种方式

      java 遍历Map的四种方式 CreationTime--2018年7月16日16点15分 Author:Marydon 一.迭代key&value 第一种方式:迭代entrySet 1 ...

  2. java遍历Map的几种方式

    1.遍历map的几种方式:private Hashtable<String, String> emails = new Hashtable<String, String>(); ...

  3. Java遍历Map的3种方式

    package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...

  4. java遍历map的四种方式

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  5. Java遍历Map的4种方式

    public static void main(String[] args) { // 循环遍历Map的4中方法 Map<Integer, Integer> map = new HashM ...

  6. Java遍历map的五种方式

    使用For-Each迭代entries 这是最常见的方法,并在大多数情况下更可取的.当你在循环中需要使用Map的键和值时,就可以使用这个方法 Map<Integer, Integer> m ...

  7. [JAVA]JAVA遍历Map的几种方式

    //遍历key for (String key : dic.keySet() ) { System.out.println(key + dic.get(key)); } //遍历values for ...

  8. 遍历map的几种方式

    1,平时开发中对map的使用很多,然后发现了很多map可能存在的各种问题:如HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大,resize ...

  9. 遍历map的6种方式

    1,平时开发中对map的使用很多,然后发现了很多map可能存在的各种问题:如HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大,resize ...

随机推荐

  1. 阿里云esc 安装 mysql8.0

    打开 连接工具,我用的是 MobaXterm_Personal_12.1 (官网下载地址:https://moba.en.softonic.com/) 连接到 ecs,然后移除 默认的 mariadb ...

  2. MariaDB主从复制和读写分离

    一.基础环境 二.配置MariaDB服务 1.安装MariaDB # yum install -y mariadb mariadb-server # systemctl start mariadb # ...

  3. canves做的时钟目前已经开源

    canves做的时钟目前已经开源 git地址: https://github.com/jidanji/canves-clock/tree/1.0.1 项目截图 时流过的时间变得有颜色,其他的没有颜色.

  4. HttpRunner学习1--Windows&Linux安装httprunner

    最近在学习HttpRunner,这是一款开源的接口测试框架,可用于HTTP(S)协议的接口测试.通过该框架,我们只需维护一份 YAML/JSON 脚本,即可轻松的进行接口自动化. 更多的介绍,大家可以 ...

  5. `MediaDevices.getUserMedia` `undefined` 的问题

    通过 MediaDevices.getUserMedia() 获取用户多媒体权限时,需要注意其只工作于以下三种环境: localhost 域 开启了 HTTPS 的域 使用 file:/// 协议打开 ...

  6. 新建GitHub仓库与删除

    一.登录GitHub创建仓库 ,步骤如下: 1.点击新建 2.填写仓库名称等 3.创建完成 二.关联已有的本地项目(没有需要关联的本地项目,可以直接从刚刚创建的GitHub仓库clone) 1.到本地 ...

  7. GTID复制的工作原理

    参考自:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html 笔记说明: 本文翻译自官网,当然会根据语义做一 ...

  8. log file sync等待超高案例浅析

    监控工具DPA发现海外一台Oracle数据库服务器DB Commit Time指标告警,超过红色告警线(40毫秒左右,黄色告警是10毫秒,红色告警线是20毫秒),如下截图所示,生成了对应的时段的AWR ...

  9. Error: Unable to establish IPMI v2 / RMCP+ session

    是这样的,需要ipmi控制器,然后一直报错这个: [root@localhost ~]# sudo ipmitool -I lanplus -H 192.168.87.12 -U root -P pa ...

  10. Linux命令详解 三

    Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...