zoukankan      html  css  js  c++  java
  • Java中遍历Map对象的方式

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

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

    map.keySet();//键集合
    map.values();//值集合
    map.entrySet();//键值集合

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

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

    public static void method1EntrySet(Map<String, Object> map) {
            System.out.println(" 第一种方式 entrySet ");
    //        如果map为空,就不执行for循环体
    //        map = new HashMap<>();
            Set<Map.Entry<String, Object>> set2 = map.entrySet();
            for (Map.Entry<String, Object> entry : set2) {
                System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
            }
            System.out.println("---- method2EntrySet done ----");
        }

       注意:for-each循环在java 5中被引入,所以该方法只能应用于java 5或更高的版本中。如果你遍历的是一个空的map对象,for-each循环将自动跳过循环体。 

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

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

        public static void methodKeySet(Map<String, Object> map) {
            System.out.println(" 第二种方式 KeySet ");
            Set<String> keSet = map.keySet();
            for (Iterator<String> iterator = keSet.iterator(); iterator.hasNext(); ) {
                String key = iterator.next();
                System.out.println(key + " value: " + map.get(key));
            }
        }
    
        public static void methodValue(Map<String, Object> map) {
            System.out.println(" 第二种方式values");
            Collection<Object> co = map.values();
            Object[] list = co.toArray();
            System.out.println(" ----------- Just get value. " + list[0]);
            for (Iterator<Object> iterator = co.iterator(); iterator.hasNext(); ) {
                String ret = (String) iterator.next();
                System.out.println(ret);
            }
        }

    方法三 使用迭代器Iterator遍历

      public static void methodIterator(Map<String, Object> map) {
            System.out.println(" 第三种遍历方式 method4Iterator");
            Iterator<Map.Entry<String, Object>> entries = map.entrySet().iterator();
            while (entries.hasNext()) {
                Map.Entry<String, Object> entry = entries.next();
                System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
            }
        }

       你也可以在keySet和values上应用该方法。

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

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

     

    方法四 通过键找值遍历

        public static void methodGetKey(Map<String, Object> map) {
            System.out.println(" 第四种方式 methodGetKey ");
            Set<String> keSet = map.keySet();
            for (Iterator<String> iterator = keSet.iterator(); iterator.hasNext(); ) {
                String key = iterator.next();
                System.out.println(key + " value: " + map.get(key));
            }
        }

       该方法与方法一的功能相同,但是,它看上去更加整洁;但实际上它相当慢且效率极低。因为从键取值是耗时的操作,姑尽量避免使用。 

    方法五 使用jdk8的新增方法

       public static void methodJdk8(Map<String, Object> map) {
            System.out.println(" 第五种遍历方式 基于 Jdk 8");
    
            //通过Map.keySet遍历key和value
            map.keySet().forEach(key ->
                    System.out.println("java8 key==>" + key + ",对应的value==>" + map.get(key)));
    
            System.out.println("- Map.values()遍历所有的value,但不能遍历key -");
            map.values().forEach(System.out::println); // 等价于map.values().forEach(value -> System.out.println(value));
            // 通过Map.entrySet使用Iterator遍历key和value
             map.entrySet().iterator().forEachRemaining(item -> System.out.println("key:value=" + item.getKey() + ":" + item.getValue()));
            System.out.println("通过Map.entrySet遍历key和value,在大容量时推荐使用");
            map.entrySet().forEach(entry -> System.out.println("key:value = " + entry.getKey() + ":" + entry.getValue()));
    
            System.out.println("通过k,v遍历,Java8新增方法");
            map.forEach((key, value) -> System.out.println("key:value = " + key + ":" + value));
        }

    总结

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

       第一和第三种的区别其实就是使用迭代器iteratior和使用一般的for语句的区别,和map本身倒没什么关系。最简单的判断方法,就是对要迭代的内容(本例是个map,如果是一个list同理),在循环过程中,你需要进行add或者remove操作不。for语句的循环是不能做这样的操作的,只能使用迭代器。

  • 相关阅读:
    HDFS源码分析(六)-----租约
    YARN源码分析(一)-----ApplicationMaster
    YARN源码分析(一)-----ApplicationMaster
    YARN源码分析(一)-----ApplicationMaster
    YARN源码分析(二)-----ResourceManager中的NM节点管理
    YARN源码分析(二)-----ResourceManager中的NM节点管理
    Confluence 6 如何备份和恢复
    Confluence 6 那些文件需要备份
    Confluence 6 确定一个生产系统备份方案
    Confluence 6 生产环境备份策略
  • 原文地址:https://www.cnblogs.com/east7/p/12301022.html
Copyright © 2011-2022 走看看