Java中如何遍历Map对象的4种方法

在Java中如何遍历Map对象

How to Iterate Over a Map in Java

在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。

既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)

方法一 在for-each循环中使用entries来遍历

这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。

[java] view plain copy

  1. Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  2. for (Map.Entry<Integer, Integer> entry : map.entrySet()) {  
  3.     System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  
  4. }  

注意:for-each循环在java 5中被引入所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将抛出NullPointerException,因此在遍历前你总是应该检查空引用。

方法二 在for-each循环中遍历keys或values。

如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。

[java] view plain copy

  1. Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  2. //遍历map中的键
  3. for (Integer key : map.keySet()) {  
  4.     System.out.println("Key = " + key);  
  5. }  
  6. //遍历map中的值
  7. for (Integer value : map.values()) {  
  8.     System.out.println("Value = " + value);  
  9. }  

该方法比entrySet遍历在性能上稍好(快了10%),而且代码更加干净。

方法三使用Iterator遍历

使用泛型:

[java] view plain copy

  1. Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  2. Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();  
  3. while (entries.hasNext()) {  
  4.     Map.Entry<Integer, Integer> entry = entries.next();  
  5.     System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());  
  6. }  

不使用泛型:

[java] view plain copy

  1. Map map = new HashMap();  
  2. Iterator entries = map.entrySet().iterator();  
  3. while (entries.hasNext()) {  
  4.     Map.Entry entry = (Map.Entry) entries.next();  
  5.     Integer key = (Integer)entry.getKey();  
  6.     Integer value = (Integer)entry.getValue();  
  7.     System.out.println("Key = " + key + ", Value = " + value);  
  8. }  

你也可以在keySet和values上应用同样的方法。

该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。

从性能方面看,该方法类同于for-each遍历(即方法二)的性能。

方法四、通过键找值遍历(效率低)

[java] view plain copy

  1. Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
  2. for (Integer key : map.keySet()) {  
  3.     Integer value = map.get(key);  
  4.     System.out.println("Key = " + key + ", Value = " + value);  
  5. }  

作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的Map实现中该方法慢了20%~200%)。如果你安装了FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。

总结

如果仅需要键(keys)或值(values)使用方法二。如果你使用的语言版本低于java 5,或是打算在遍历时删除entries,必须使用方法三。否则使用方法一(键值都要)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CRPER折腾记

JS数组去重!!!一篇不怎么靠谱的"深度"水文

数组去重,这是一个老梗了...今天我又拿出来说了... 我们在考虑全面一点的情况下,数组去重的实现,比如针对NaN,undefined,{}; 这其中涉及的知识...

1034
来自专栏Python爬虫与数据挖掘

浅谈Python内置对象类型——数字篇(附py2和py3的区别之一)

Python是一门面向对象的编程设计语言,程序中每一样东西都可以视为一个对象。Python内置对象可以分为简单类型和容器类型,简单类型主要是数值...

1022
来自专栏一“技”之长

Swift讲解专题五——集合类型 原

        Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型。Array用于存放一组有序的数据,数据角标从0...

803
来自专栏AILearning

Map集合

Collection |--List:元素是有序的,元素可以重复,因为该集合体系有索引 |--ArrayList:底层的数据结构使用的是数据结构。特点:查询...

2376
来自专栏电光石火

Java遍历Map对象的四种方式

关于java中遍历map具体哪四种方式,请看下文详解吧。 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 Map<I...

40110
来自专栏向治洪

java 之容器

在Java中,我们想要保存对象可以使用很多种手段。我们之前了解过的数组就是其中之一。但是数组具有固定的尺寸,而通常来说,程序总是在运行时根据条件来创建对象,我们...

2218
来自专栏LanceToBigData

Java常用类(四)之数组工具类Arrays

前言   数组的工具类java.util.Arrays   由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而...

2627
来自专栏武培轩的专栏

剑指Offer-和为S的两个数字

题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每...

3214
来自专栏章鱼的慢慢技术路

顺序表示的线性表——顺序表

2224
来自专栏Android开发指南

12:集合map、工具类

3618

扫码关注云+社区

领取腾讯云代金券