Java Map的几种遍历方式

Java中Map的几种遍历方式

大概这常用的三种方式,直接贴代码:

public class PrintMap {
	private static Map<String, String> countries = new HashMap<String, String>();
	static{
		//存入一个值
		countries.put("CHA", "中华人民共和国");
		countries.put("JPA", "日本");
		countries.put("KOR", "韩国");
	}
	
	/**
	 * 适合获取map中的所有键和值
	 */
	public static void  print1(){
		//1.思路
		//获取Map中的所有的键值,---》循环遍历键----》get(key)
		Set<String> keySet = countries.keySet();
		Iterator<String> it = keySet.iterator();
		while(it.hasNext()){//遍历所有的键值
			String  key = it.next();
			String value = countries.get(key);
			System.out.println("[key = " + key + ",value = " + value);
		}
		
	}
	
	/**
	 * 适合获取map中的所有值
	 */
	public static void print2(){
		//思路:先获取所有的value--->Collection
		Collection<String> values = countries.values();
		Iterator<String> it = values.iterator();
		while(it.hasNext()){
			String value = it.next();
			System.out.println(value);
		}
	}
	
	
	public static void print3(){
		//思路:先获取map中的所有条目Map.Entry--->Set--->迭代Set
		Set<Map.Entry<String, String>> entrySet = countries.entrySet();
		Iterator<Map.Entry<String, String>> it = entrySet.iterator();
		while(it.hasNext()){
			Map.Entry<String, String> entry = it.next();
			String key = entry.getKey();
			String value = entry.getValue();
			System.out.println("[key = " + key + ",value = " + value);
		}
	}
	
	
	public static void main(String[] args) {
		print1();
		print2();
		print3();
	}
}

控制台输出:

[key = JPA,value = 日本
[key = CHA,value = 中华人民共和国
[key = KOR,value = 韩国
日本
中华人民共和国
韩国
[key = JPA,value = 日本
[key = CHA,value = 中华人民共和国
[key = KOR,value = 韩国

keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。
当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。

如果是JDK8,使用Map.foreach方法。

在JDK8以后,引入了Map.foreach。

Map.foreach本质仍然是entrySet

default void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);
        for (Map.Entry<K, V> entry : entrySet()) {
            K k;
            V v;
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch(IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            action.accept(k, v);
        }
    }

配合lambda表达式一起使用,操作起来更加方便。

使用Java8的foreach+lambda表达式遍历Map

Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60);
 
items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
 
items.forEach((k,v)->{
    System.out.println("Item : " + k + " Count : " + v);
    if("E".equals(k)){
        System.out.println("Hello E");
    }
});

 Share!

 
comments powered by Disqus