Java8|Java8 HashMap遍历方式性能探讨
原因:
keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
一. keySet和entrySet
Map map = new HashMap(); int num = 5000000; String key, value; // 存放500万条数据for (int i = 1; i <= num; i++) {key = "" + i; https://www.it610.com/article/value = "value"; map.put(key, value); }
1.1 基本用法
keySet:
Map map=new HashMap(); Iterator it=map.keySet().iterator(); Object key; Object value; while(it.hasNext()){key=it.next(); value=https://www.it610.com/article/map.get(key); System.out.println(key+":"+value); }
时间:只获取key 50; 获取key和value 170
entrySet:
Map map=new HashMap(); Iterator it=map.entrySet().iterator(); Object key; Object value; while(it.hasNext()){Map.Entry entry = (Map.Entry)it.next(); key=entry.getKey(); value=https://www.it610.com/article/entry.getValue(); System.out.println(key+"="+value); }
时间:只获取key或获取value 时间差不多 110-140; 获取key和value 140
源码上看:
keySet:
final class KeyIterator extends HashIteratorimplements Iterator{public final K next() { return nextNode().key; }}
entrySet:
final class EntryIterator extends HashIteratorimplements Iterator> {public final Map.Entry next() { return nextNode(); }}
其实这里已经很明显了,当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。
for (String key1 : map.keySet()) {value = https://www.it610.com/article/map.get(key1); }
时间:170
for (Entry entry1 : map.entrySet()) { key = entry1.getKey(); value = https://www.it610.com/article/entry1.getValue(); }
时间:130
比较:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
二. Map.foreach 在JDK8以后,引入了Map.foreach。
Map.foreach本质仍然是entrySet
default void forEach(BiConsumer super K, ? super V> action) {Objects.requireNonNull(action); for (Map.Entryentry : 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表达式一起使用,操作起来更加方便。
2.1 使用Java8的foreach+lambda表达式遍历Map
Map 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"); }});
时间:158
【Java8|Java8 HashMap遍历方式性能探讨】到此这篇关于Java8 HashMap遍历方式性能探讨的文章就介绍到这了,更多相关Java8 HashMap遍历方式性能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- HashMap&ConcurrentHashMap&HashTable
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- for循环遍历数组
- HashMap负载因子
- 集合框架(集合嵌套存储和遍历元素的案例代码实现)
- Java8|Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用
- LeetCode-102.|LeetCode-102. 二叉树的层序遍历
- 先序遍历 中序遍历 后序遍历 层序遍历
- map的简单使用(去重和遍历)