HashMap我整理了七种遍历方式:
-
Iterator entrySet
-
Iterator keySet
-
ForEach entrySet
-
ForEach keySet
-
lambda
-
stream entrySet
-
stream 多线程 entrySet
下面看代码:
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("1", "孙悟空");
map.put("2", "布尔玛");
map.put("3", "雅木茶");
map.put("4", "普亚路");
map.put("5", "乌龙");
// 1、Iterator entrySet
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
System.out.println(next.getKey());
System.out.println(next.getValue());
}
// 2、Iterator keySet
Iterator<String> keySetIterator = map.keySet().iterator();
while (keySetIterator.hasNext()) {
String key = keySetIterator.next();
System.out.println(key);
System.out.println(map.get(key));
}
// ForEach entrySet
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
System.out.println(stringStringEntry.getKey());
System.out.println(stringStringEntry.getValue());
}
// ForEach keySet
for (String key : map.keySet()) {
System.out.println(key);
System.out.println(map.get(key));
}
// lambda
map.forEach((key,value)->{
System.out.println(key);
System.out.println(value);
});
// stream entrySet
map.entrySet().stream().forEach(entry->{
System.out.println(entry.getKey());
System.out.println(entry.getValue());
});
// stream 多线程 entrySet
map.entrySet().parallelStream().forEach(entry->{
System.out.println(entry.getKey());
System.out.println(entry.getValue());
});
}
效率:
实际应用能用entrySet就用entrySet,该效率比keySet快了一倍。
至于为什么entrySet比keySet效率块,是因为遍历的时候,entry已经获取到了key和value,直接用即可,而keySet 获取到key之后又要通过map.get(key) 遍历一遍,因此效率没有entrySet快。
存在阻塞时 parallelStream 性能最高, 非阻塞时 parallelStream 性能最低 。该方法尽量在数据量巨大的时候才考虑用,不然区别不大。