欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8 HashMap遍歷方式性能探討

 更新時間:2021年09月17日 15:43:44   作者:Hosee  
JDK8之前,可以使用keySet或者entrySet來遍歷HashMap,JDK8中引入了map.foreach來進行遍歷

原因:

keySet其實是遍歷了2次,一次是轉為Iterator對象,另一次是從hashMap中取出key所對應的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)很明顯了,當要得到某個value時,keySet還需要從HashMap中get,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次,一次是轉為Iterator對象,另一次是從hashMap中取出key所對應的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

二. Map.foreach

在JDK8以后,引入了Map.foreach。

Map.foreach本質仍然是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

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

相關文章

  • Java日期格式化的實現(xiàn)(@JsonFormat和@JSONField)

    Java日期格式化的實現(xiàn)(@JsonFormat和@JSONField)

    本文主要介紹了Java日期格式化的實現(xiàn),主要介紹了@JsonFormat和@JSONField兩種方式,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • Java工具之ja-netfilter?2022.1?配置教程

    Java工具之ja-netfilter?2022.1?配置教程

    這篇文章主要介紹了Java工具之ja-netfilter?2022.1?配置教程,本防火墻基于javaagent,所以目前只有基于java的程序能夠使用,需要的朋友可以參考下
    2022-04-04
  • 詳解SpringSecurity如何實現(xiàn)前后端分離

    詳解SpringSecurity如何實現(xiàn)前后端分離

    這篇文章主要為大家介紹了詳解SpringSecurity如何實現(xiàn)前后端分離,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Mybatis 中的sql批量修改方法實現(xiàn)

    Mybatis 中的sql批量修改方法實現(xiàn)

    在項目中遇到需要批量更新的功能,原本想的是在Java中用循環(huán)訪問數(shù)據(jù)庫去更新,但是心里總覺得這樣做會不會太頻繁了,太耗費資源了,效率也很低,查了下mybatis的批量操作,原來確實有<foreach>標簽可以做到,下面通過本文給大家介紹下
    2017-01-01
  • Java畢業(yè)設計實戰(zhàn)之共享租車信息管理系統(tǒng)的實現(xiàn)

    Java畢業(yè)設計實戰(zhàn)之共享租車信息管理系統(tǒng)的實現(xiàn)

    這是一個使用了java+Jsp+Servlet+Jdbc+Mysql開發(fā)的共享租車信息管理系統(tǒng),是一個畢業(yè)設計的實戰(zhàn)練習,具有租車管理該有的所有功能,感興趣的朋友快來看看吧
    2022-02-02
  • 詳解Java如何實現(xiàn)有效的并發(fā)處理

    詳解Java如何實現(xiàn)有效的并發(fā)處理

    隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,現(xiàn)代軟件系統(tǒng)對于并發(fā)性能的要求越來越高,如何學習和掌握并發(fā)編程技術成為了Java開發(fā)人員必備的技能之一,本文主要介紹了Java并發(fā)編程的相關概念、原理和實踐技巧,感興趣的可以了解下
    2023-11-11
  • ResultSet如何動態(tài)獲取列名和值

    ResultSet如何動態(tài)獲取列名和值

    這篇文章主要介紹了ResultSet如何動態(tài)獲取列名和值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • IDEA運行Tomcat中文亂碼出現(xiàn)的各種問題

    IDEA運行Tomcat中文亂碼出現(xiàn)的各種問題

    這篇文章主要介紹了IDEA運行Tomcat中文亂碼的各種問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java實戰(zhàn)個人博客系統(tǒng)的實現(xiàn)流程

    Java實戰(zhàn)個人博客系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+mybatis+redis+vue+elementui+Mysql實現(xiàn)一個個人博客系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • 深入理解Java運行時數(shù)據(jù)區(qū)_動力節(jié)點Java學院整理

    深入理解Java運行時數(shù)據(jù)區(qū)_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java運行時數(shù)據(jù)區(qū)的相關知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-06-06

最新評論