服务器之家

服务器之家 > 正文

Java8 HashMap遍历方式性能探讨

时间:2022-01-07 13:22     来源/作者:Hosee

原因:

keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

一. keySet和entrySet

?
1
2
3
4
5
6
7
8
9
10
Map<String, String> map = new HashMap<String, String>();
        int num = 5000000;
        String key, value;
        // 存放500万条数据
        for (int i = 1; i <= num; i++) {
            key = "" + i;
            value = "value";
            map.put(key, value);
 
     }

1.1 基本用法

keySet:

?
1
2
3
4
5
6
7
8
9
Map map=new HashMap();
Iterator it=map.keySet().iterator();
Object key;
Object value;
while(it.hasNext()){
key=it.next();
value=map.get(key);
System.out.println(key+":"+value);
}

时间:只获取key 50;获取key和value 170

entrySet:

?
1
2
3
4
5
6
7
8
9
10
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=entry.getValue();
System.out.println(key+"="+value);
}

时间:只获取key或获取value 时间差不多 110-140;获取key和value 140

源码上看:

keySet:

?
1
2
3
4
final class KeyIterator extends HashIterator
        implements Iterator<K> {
        public final K next() { return nextNode().key; }
    }

entrySet:

?
1
2
3
4
final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

其实这里已经很明显了,当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。

?
1
2
3
for (String key1 : map.keySet()) {
            value = map.get(key1);
}

时间:170

?
1
2
3
4
for (Entry<String, String> entry1 : map.entrySet()) {
    key = entry1.getKey();
    value = entry1.getValue();
}

时间:130

比较:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

二. Map.foreach

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

Map.foreach本质仍然是entrySet

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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表达式一起使用,操作起来更加方便。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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");
    }
});

时间:158

到此这篇关于Java8 HashMap遍历方式性能探讨的文章就介绍到这了,更多相关Java8 HashMap遍历方式性能内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://my.oschina.net/hosee/blog/1488876

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部