Java中遍历Map的五种方法

转载 2018年04月16日 13:34:38

Java中遍历Map的五种方法

Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点

先初始化一个map

public class TestMap {
  public static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
}

1. keySet values

如果只需要map的key或者value,用map的keySet或values方法无疑是最方便的

  // 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,一般情况下,性能上要优于上一种,这一种也是最常用的遍历方法

  // entrySet 获取key and value
  public void testEntry() {
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }
  }

4. Iterator

对于上面的几种foreach都可以用Iterator代替,其实foreach在java5中才被支持,foreach的写法看起来更简洁

但Iterator也有其优势:在用foreach遍历map时,如果改变其大小,会报错,但如果只是删除元素,可以使用Iterator的remove方法删除元素

  // Iterator entrySet 获取key and 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

java8提供了Lambda表达式支持,语法看起来更简洁,可以同时拿到key和value,不过,经测试,性能低于entrySet,所以更推荐用entrySet的方式

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

简单性能测试

用10万条数据,做了一个简单性能测试,数据类型为Integer,map实现选取HashMap

static {
    for (int i = 0; i < 100000; i++) {
      map.put(i, 1);
    }
  }

测试结果如下:

KeySet:           392
Values:           320
keySet get(key):  552
entrySet:         465
entrySet Iterator:508
Lambda:           536

需要说明的是,map存储的数据类型,map的大小,以及map的不同实现方式都会影响遍历的性能,所以该测试结果仅供参考

总结

  1. 如果只是获取key,或者value,推荐使用keySet或者values方式

  2. 如果同时需要key和value推荐使用entrySet

  3. 如果需要在遍历过程中删除元素推荐使用Iterator

  4. 如果需要在遍历过程中增加元素,可以新建一个临时map存放新增的元素,等遍历完毕,再把临时map放到原来的map中


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

使用目录内容建立菜单

目的:根据目录内容,建立一个菜单。菜单项为目录中的文件和子目录(以弹出方式显示)。解决方案:遍历子目录,建立一个文件路径数组。菜单项的ID是数组的索引。当用户单击某个菜单项时,从数组中读取文件路径并执...
  • jiangsheng
  • jiangsheng
  • 2001-08-02 22:58:00
  • 2068

java中Map的两种遍历方法

  • 2012年12月01日 11:26
  • 1KB
  • 下载

Java中遍历Map的几种方法总结

方法一 在for-each循环中使用entries来遍历 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 Map map = new HashMap(); for (M...
  • qian_xiao_lj
  • qian_xiao_lj
  • 2016-02-26 09:49:27
  • 6477

java遍历Map效率最高的方式

遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是:public static void main(String args...) { ...
  • q649381130
  • q649381130
  • 2017-11-30 14:57:41
  • 1057

Java 遍历Map的2种方法(KeySet、EntrySet)

(1)在需要同时获取Map的时,EntrySet比KeySet方法要快很多。 (2)如果只需要获取Map的Key,建议使用KeySet方法,因为不需要像EntrySet一样开辟额外的空间存储value...
  • chy555chy
  • chy555chy
  • 2016-08-03 19:36:15
  • 1602

java Map遍历的5种方法

package com.npnets.map;import java.util.HashMap; import java.util.Iterator; import java.util.Map; im...
  • Mrzhang__
  • Mrzhang__
  • 2016-11-22 10:03:03
  • 2134

java中Map集合的常用遍历方法及HashMap的应用实例

  • 2016年06月15日 13:41
  • 2KB
  • 下载

Map的5种遍历方法

//循环遍历map的方法 public class MapF { public static void main(String[] args) { Map tempMap = new HashM...
  • zhu1qiu
  • zhu1qiu
  • 2017-05-04 15:14:37
  • 46046

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

在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法。我们看一下最常用的方法及其优缺点。 既然java中的所有map都...
  • tjcyjd
  • tjcyjd
  • 2013-09-05 10:19:21
  • 589111

Java学习之4种方法遍历Map集合

public static void main(String[] args) { Map map = new HashMap(); map.put("1", "value1"); ma...
  • u012527802
  • u012527802
  • 2015-04-24 10:10:21
  • 8397
收藏助手
不良信息举报
您举报文章:Java中遍历Map的五种方法
举报原因:
原因补充:

(最多只允许输入30个字)