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();
}
}