最近在看阿里巴巴最新版的Java开发手册,里面的内容还是很值得去阅读学习,下面是我对Java中Map的遍历方式的比较和总结:
第一种:使用entrySet()
的形式来遍历,也是效率高,推荐使用的一种遍历map的方式:
Map<String, String> map = new HashMap<>();
map.put("x", "aaa");
map.put("y", "bbb");
for (Map.Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey()+ "---" + entry.getValue());
}
打开entrySet()
的源码可以看到:
Set<Map.Entry<K, V>> entrySet();
该方法返回的是一个Set
集合,集合中的类型是一个Map.Entry<K,V>
类型,其中Entry<K,V>
对象中保存的就是map中的键值对映射,所以,调用entrySet()
方法,是直接返回一个K-V
键值对,所以我们就可以直接对Map.Entry<K,V>
对象调用getKey()
和getValue()
方法来获取map中的键和对应的值。其中Entry
是一个interface
,属于Map
接口中的,而且Entry
接口有getValue(),getKey(),remove(),setValue()
等方法。
优点:直接返回一个k-v对象。
第二种:使用keySet()
方法进行遍历,代码实现如下:
Map<String, String> map = new HashMap<>();
map.put("x", "aaa");
map.put("y", "bbb");
Iterator<String> iteratorMap = map.keySet().iterator();
while (iteratorMap.hasNext()){
System.out.println(iteratorMap.next() + "====" + map.get(iteratorMap.next()));
}
keySet
其实是遍历了2次,一次是转为Iterator
对象,另一次是从hashMap
中取出key
所对应的value
第三种:使用JDK 8中的Map.foreach()
操作:
Map<String, String> map = new HashMap<>();
map.put("x", "aaa");
map.put("y", "bbb");
map.forEach((k,v)-> System.out.println(k + "---" +v));
在JDK 1.8中Map
接口中增加了默认的实现,点击map.foreach()
可以看到如下源码:
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);
}
}
JAVA 8的新特性就是增加了函数式编程,里面的实现还是利用entrySet()
来实现map集合的遍历。