HashMap 遍历方式及其性能对比

HashMap的几种遍历方式

int num = 10000;
HashMap map = new HashMap();
for (int i = 0; i < num; i++) {
	map.put(i, "第" + i + "个");
}

 (1) for each entrySet()循环

for (Entry entry : map.entrySet()) {
	entry.getKey();
	entry.getValue();
}

Set> entrySet = map.entrySet();
for (Entry entry : entrySet) {
	entry.getKey();
	entry.getValue();
}

// JDK8以后,引入了Map.foreach
map.forEach((k, v) -> {

});

 (2) 迭代器Iterator

Iterator> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
	Map.Entry entry = iterator.next();
	entry.getKey();
	entry.getValue();
}

(3) foreach keySet()

Set keySet = map.keySet();
for (Integer key : keySet) {
	map.get(key);
}

(4) foreach values()

List valuesList = new ArrayList(map.values());
for (String value : valuesList) {

}

测试环境 :
           Java 8,Eclipse -Xms512m -Xmx512m

          HashMap 遍历方式及其性能对比_第1张图片

最终测试结果:

HashMap 遍历方式及其性能对比_第2张图片            HashMap 遍历方式及其性能对比_第3张图片

性能测试结果分析:
     1、 Iterator 性能总是最优
     2、entrySet 在JDK8 性能与iterator相差不多,推荐使用
     3、JDK8新增的Map.forEach()方法最差 不建议使用

扩展:

  JDK8 Map.forEach()源码:

@Override
public void forEach(BiConsumer action) {
	Node[] tab;
	if (action == null)
		throw new NullPointerException();
	if (size > 0 && (tab = table) != null) {
		int mc = modCount;
		for (int i = 0; i < tab.length; ++i) {
			for (Node e = tab[i]; e != null; e = e.next)
				action.accept(e.key, e.value);
		}
		if (modCount != mc)
			throw new ConcurrentModificationException();
	}
}

 

你可能感兴趣的:(Java)