阿里Java手册剖析-6.18【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。

1,076 阅读2分钟

阿里Java开发手册剖析:


【推荐】使用 entrySet 遍历 Map 类集合 KV,而不是 keySet 方式进行遍历。

说明:keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出 key 所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。如果是 JDK8,使用 Map.forEach 方法。

正例:values()返回的是 V 值集合,是一个 list 集合对象;keySet()返回的是 K 值集合,是一个 Set 集合对 象;entrySet()返回的是 K-V 值组合集合。


    public static void main(String[] args) {
        HashMap<String, Person> persons = new HashMap<>();
        persons.put("小名",new Person(11,0,"小名"));
        persons.put("小黄",new Person(12,0,"小黄"));
        persons.put("小红",new Person(13,1,"小红"));
        
        Set<String> strings = persons.keySet();
        for (String string : strings) {
            System.out.println(persons.get(string).toString());
        }
               }
    }


使用下面写法效率更高:


    public static void main(String[] args) {
        HashMap<String, Person> persons = new HashMap<>();
        persons.put("小名",new Person(11,0,"小名"));
        persons.put("小黄",new Person(12,0,"小黄"));
        persons.put("小红",new Person(13,1,"小红"));

        Set<Map.Entry<String, Person>> entries = persons.entrySet();
        for (Map.Entry<String, Person> entry : entries) {
            System.out.println(entry.getValue());
        }
    }


JDK8后有更简单的写法:


persons.forEach((s, person) -> {
	 System.out.println(person.toString());		
        });

如果不会用lamada表达,可以写成下面样式:

  persons.forEach(new BiConsumer<String, Person>() {
            @Override
            public void accept(String s, Person person) {
			 System.out.println(person.toString());		
            }
        });