HashMap 遍歷方式及其性能對比

HashMap的幾種遍歷方式

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

 (1) for each entrySet()循環

for (Entry<Integer, String> entry : map.entrySet()) {
	entry.getKey();
	entry.getValue();
}

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

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

});

 (2) 迭代器Iterator

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

(3) foreach keySet()

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

(4) foreach values()

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

}

測試環境 :
           Java 8,Eclipse -Xms512m -Xmx512m

          

最終測試結果:

            

性能測試結果分析:
     1、 Iterator 性能總是最優
     2、entrySet 在JDK8 性能與iterator相差不多,推薦使用
     3、JDK8新增的Map.forEach()方法最差 不建議使用

擴展:

  JDK8 Map.forEach()源碼:

@Override
public void forEach(BiConsumer<? super K, ? super V> action) {
	Node<K,V>[] 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<K,V> e = tab[i]; e != null; e = e.next)
				action.accept(e.key, e.value);
		}
		if (modCount != mc)
			throw new ConcurrentModificationException();
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章