Java8 HashMap遍历方式性能探讨

网友投稿 254 2022-12-07

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万条数据

http:// for (int i = 1; i <= num; i++) {

key = "" + i;

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=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=entry.getValue();

System.out.println(key+"="+value);

}

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

源码上看:

keySet:

final class KeyIterator extends HashIterator

implements Iterator {

public final K next() { return nextNode().key; }

}

entrySet:

final class EntryIterator extends HashIterator

implements Iterator> {

public final Map.Entry next() { return nextNode(); }

}

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

for (String key1 : map.keySet()) {

value = map.get(key1);

}

时间:170

for (Entry 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

default void forEach(BiConsumer super K, ? super V> action) {

Objects.requireNonNull(action);

for (Map.Entry 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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HashMap在JDK7与JDK8中的实现过程解析
下一篇:一篇文章带你了解JVM内存模型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~