zoukankan      html  css  js  c++  java
  • [转载] Java 遍历 Map 的 5 种方式


    版权声明: 本文为转载文章, 转载时有适量修改. 再次转载时请附上原文出处链接和本声明.
    作者: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 中.

    版权声明

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

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

  • 相关阅读:
    1.xposed框架简介
    Spinner android:entries属性
    nginx 负载均衡时,一台tomcat宕机时的问题 自动切换(转自java版web项目-微信公众号)
    java内存模型(JMM)之happens-before
    java中Infinity(无限)和NaN
    mysql数据库相关操作
    提高mysql数据库查询效率
    转载-----通过xml处理sql语句时对小于号与大于号的处理转换
    JAVA过滤器和springMVC拦截器的区别
    Java中的Filter过滤器
  • 原文地址:https://www.cnblogs.com/shoufeng/p/11774640.html
Copyright © 2011-2022 走看看