首页 > 编程语言 >Java 遍历 Map 的 5 种方式

Java 遍历 Map 的 5 种方式

时间:2022-12-29 23:12:58浏览次数:44  
标签:Map 遍历 Java entrySet value keySet key

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

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

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

 1 public class TestMap {
 2     /**
 3      * Map 的扩容比较消耗性能, 因此若能确定存储数据的大小,
 4      * 在初始化时指定初始容量是一个不错的实践技巧
 5      */
 6     private static Map<Integer, Integer> map = new HashMap<>(16);
 7 
 8     /** keySet 获取 key */
 9     public void testKeySet() {
10         for (Integer key : map.keySet()) {
11           System.out.println(key);
12         }
13     }
14     /** values 获取 value */
15     public void testValues() {
16         for (Integer value : map.values()) {
17             System.out.println(value);
18         }
19     }
20 }

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

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

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

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

3 通过 entrySet 遍历

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

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

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

4 通过迭代器 Iterator 遍历

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

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

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

5 通过 Lambda 表达式遍历

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

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

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

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

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

标签:Map,遍历,Java,entrySet,value,keySet,key
From: https://www.cnblogs.com/lixuejian/p/17013757.html

相关文章

  • JavaWeb_多级查询 案例_表数据及练习详解
    此案例来自于B站黑马程序员JavaWeb教程,由于视频未给表数据,故特此手打于此,大家有需要可自取练习(也付有相应多级查询练习题和解答,可供参考)黑马程序员JavaWeb教程地址:https......
  • 2.1JavaScript基础语法
    第一章1计算机编程基础什么是编程语言编程语言和标记语言的不同常见的数据存储单位及其换算关系内存的主要作用以及特点2编程语言编程:就是让计算机为解决某个问题而使用......
  • 4.1 Javascript高级
    JavaScript面向对象目标:能够说出什么是面向对象能够说出类和对象的关系能够使用class创建自定义类能够说出什么是继承面向对象编程介绍:两大编程思想:面向过程面向对象面向过......
  • Java开发学习(四十九)----MyBatisPlus更新语句之乐观锁
    1、概念在讲解乐观锁之前,我们还是先来分析下问题:业务并发现象带来的问题:秒杀假如有100个商品或者票在出售,为了能保证每个商品或者票只能被一个人购买,如何保证不会出......
  • Java SE:static package this关键字与访问权限
    JAVA课程-类和对象static修饰符1.static修饰变量在类中,被static修饰的变量叫做类变量,否则叫做实例变量。类变量:例如staticinta,为整个类中所有对象所共享,只能存在一......
  • Java面向对象:子类与继承
    今天听java课程感觉难度突然增加,因此注意上课记录关键笔记,提醒自己回顾。JAVA子类与继承子类与父类问题:哪些父类的变量与方法可被子类继承?与访问权限有关前提知识:jav......
  • java中的字符串反转
    本文主要讲述java中的字符串反转示例代码如下:1publicclassHomeWork01{2publicstaticvoidmain(String[]args){3Strings="abcdef";4......
  • 数组方法 JavaScript
    //连接两个数组consta1=[1,2,3];consta2=[4,5,6];consta3=a1.concat(a2);console.log(a3);console.log("----------------------------------------......
  • JAVA02
    基本运算符算数运算符:+-*/%++--赋值运算符:=关系运算符:><>=<===!=(instanceof)逻辑运算符:&&||!位运算符:&|^~>><<>>>条件运算符:?:扩......
  • Java基础之面向对象——类、对象、方法
    类与对象    类的概念我们平时已经听过很多了。人类、鸟类、鱼类...所谓类,就是对一类事物的描述,是抽象的、概念上的定义,比如鸟类,就泛指所有具有鸟类特征的动物。比......