激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Java8 HashMap遍歷方式性能探討

Java8 HashMap遍歷方式性能探討

2022-01-07 13:22Hosee Java教程

JDK8之前,可以使用keySet或者entrySet來遍歷HashMap,JDK8中引入了map.foreach來進行遍歷

原因:

keySet其實是遍歷了2次,一次是轉為Iterator對象,另一次是從hashMap中取出key所對應的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

一. keySet和entrySet

?
1
2
3
4
5
6
7
8
9
10
Map<String, String> map = new HashMap<String, String>();
        int num = 5000000;
        String key, value;
        // 存放500萬條數據
        for (int i = 1; i <= num; i++) {
            key = "" + i;
            value = "value";
            map.put(key, value);
 
     }

1.1 基本用法

keySet:

?
1
2
3
4
5
6
7
8
9
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:

?
1
2
3
4
5
6
7
8
9
10
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:

?
1
2
3
4
final class KeyIterator extends HashIterator
        implements Iterator<K> {
        public final K next() { return nextNode().key; }
    }

entrySet:

?
1
2
3
4
final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

其實這里已經很明顯了,當要得到某個value時,keySet還需要從HashMap中get,entrySet相比keySet少了遍歷table的過程,這也是兩者性能上的主要差別。

?
1
2
3
for (String key1 : map.keySet()) {
            value = map.get(key1);
}

時間:170

?
1
2
3
4
for (Entry<String, String> 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

到此這篇關于Java8 HashMap遍歷方式性能探討的文章就介紹到這了,更多相關Java8 HashMap遍歷方式性能內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://my.oschina.net/hosee/blog/1488876

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
993
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 91成人在线网站 | 国产成视频在线观看 | 看免费5xxaaa毛片 | 黄色网战入口 | 国产九色在线观看 | 国产寡妇xxxxxxxx性开放 | 91久久一区 | 成年免费观看视频 | 成人国产精品免费 | 久久成人免费网 | 在线观看视频日本 | 国产在线地址 | 麻豆视频观看 | 免费看一级视频 | 亚洲码无人客一区二区三区 | 欧美不卡三区 | 一区二区久久久久草草 | 北京一级毛片 | vidz 98hd| 国产一区二区免费看 | 欧美1区2区在线观看 | 黄色网战在线观看 | 在线男人天堂 | 国产久草视频在线 | 精国品产一区二区三区有限公司 | 一级电影免费在线观看 | 成人毛片在线 | 国产午夜精品久久久久久免费视 | 免费视频精品一区二区 | 欧美精品一区二区蜜臀亚洲 | 国产91精品久久久久久久 | 国产精品久久久久久久久久10秀 | 国产91精品一区二区麻豆亚洲 | 亚洲网站在线观看 | 国产精品亚洲一区二区三区久久 | 毛片免费大全短视频 | 欧美三日本三级少妇三级99观看视频 | 性欧美视频在线观看 | 毛片大全 | 99久久久精品国产一区二区 | 国产亚洲精品久久久久久网站 |