Java8 HashMap遍歷方式性能探討
原因:
keySet其實是遍歷了2次,一次是轉(zhuǎn)為Iterator對象,另一次是從hashMap中取出key所對應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
一. keySet和entrySet
Map<String, String> map = new HashMap<String, String>();
int num = 5000000;
String key, value;
// 存放500萬條數(shù)據(jù)
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<K> {
public final K next() { return nextNode().key; }
}
entrySet:
final class EntryIterator extends HashIterator
implements Iterator<Map.Entry<K,V>> {
public final Map.Entry<K,V> next() { return nextNode(); }
}
其實這里已經(jīng)很明顯了,當(dāng)要得到某個value時,keySet還需要從HashMap中g(shù)et,entrySet相比keySet少了遍歷table的過程,這也是兩者性能上的主要差別。
for (String key1 : map.keySet()) {
value = map.get(key1);
}
時間:170
for (Entry<String, String> entry1 : map.entrySet()) {
key = entry1.getKey();
value = entry1.getValue();
}
時間:130
比較:keySet其實是遍歷了2次,一次是轉(zhuǎn)為Iterator對象,另一次是從hashMap中取出key所對應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
二. Map.foreach
在JDK8以后,引入了Map.foreach。
Map.foreach本質(zhì)仍然是entrySet
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
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
到此這篇關(guān)于Java8 HashMap遍歷方式性能探討的文章就介紹到這了,更多相關(guān)Java8 HashMap遍歷方式性能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日期格式化的實現(xiàn)(@JsonFormat和@JSONField)
本文主要介紹了Java日期格式化的實現(xiàn),主要介紹了@JsonFormat和@JSONField兩種方式,具有一定的參考價值,感興趣的可以了解一下2024-05-05
Java工具之ja-netfilter?2022.1?配置教程
這篇文章主要介紹了Java工具之ja-netfilter?2022.1?配置教程,本防火墻基于javaagent,所以目前只有基于java的程序能夠使用,需要的朋友可以參考下2022-04-04
詳解SpringSecurity如何實現(xiàn)前后端分離
這篇文章主要為大家介紹了詳解SpringSecurity如何實現(xiàn)前后端分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Java畢業(yè)設(shè)計實戰(zhàn)之共享租車信息管理系統(tǒng)的實現(xiàn)
這是一個使用了java+Jsp+Servlet+Jdbc+Mysql開發(fā)的共享租車信息管理系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有租車管理該有的所有功能,感興趣的朋友快來看看吧2022-02-02
Java實戰(zhàn)個人博客系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實現(xiàn)一個個人博客系統(tǒng),大家可以在過程中查缺補漏,提升水平2022-01-01
深入理解Java運行時數(shù)據(jù)區(qū)_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java運行時數(shù)據(jù)區(qū)的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06

