Java-- Map的4种遍历方式
Posted MinggeQingchun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-- Map的4种遍历方式相关的知识,希望对你有一定的参考价值。
1、分别遍历 key 和 values
for(String key:map.keySet())
System.out.println(key);
for(String value:map.values())
System.out.println(value);
2、Iterator迭代器迭代
通过Set<Map.Entry<K,V>> entrySet()方法获取泛型对象为 Map.Entry<K,V> 的Set集合,然后使用Iterator迭代器遍历,每次取出 Map.Entry<K,V> 对象的 key和value
Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext())
Map.Entry<String, String> entry = entries.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+":"+value);
3、get方法获取
通过Set<K> keySet() 方法获取Map集合所有的key,然后通过key获取value
Set<String> keySet = map.keySet();
for (String key:keySet)
System.out.println(key + ":" + map.get(key));
或
Set set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext())
String key = it.next();
System.out.println("Key:" + key + ";" + "Value:" + map.get(key));
相对来说通过Set<K> keySet() 方法效率更低,获取Map集合所有的key,然后通过key获取value,需要遍历Key获取值,本身就耗时
注:
根据阿里开发手册,也不建议使用这种方法,因为会迭代两次。keySet获取Iterator一次,还要通过get又迭代一次,降低性能
4、Java8中Map接口中默认Lambda表达式
/**
*
* default void forEach(BiConsumer<? super K, ? super V> action)
* BiConsumer 接口中方法:
* void accept(T t, U u); 对给定的参数执行操作
*/
map.forEach((key,value) ->
System.out.println(key + ":" + value);
);
总结:
1、entrySet的方式整体都是比keySet方式要高一些
2、单纯的获取key来说,两者的差别并不大,但是如果要获取value,还是entrySet的效率会更好,因为keySet需要从map中再次根据key获取value,而entrySet一次都全部获取出来
3、iterator的迭代器方式比foreach的效率高
注:
foreach的语法只是对iterator进行了简单的包装,使用起来更加方便而已,但是如果在foreach循环体内,对集合元素进行删除添加操作的时候,会报出ConcurrentModificationException,并报修改异常。如果需要在遍历集合的时候对象集合中元素进行删除操作,需要使用iterator的遍历方式,iterator自带的remove删除方式不会报出异常
以上是关于Java-- Map的4种遍历方式的主要内容,如果未能解决你的问题,请参考以下文章