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

Java遍歷Map的方法匯總

 更新時(shí)間:2023年12月18日 12:00:22   作者:老鼠只愛大米  
大家平時(shí)在使用Java開發(fā)時(shí),經(jīng)常會(huì)遇到遍歷Map對(duì)象的問(wèn)題,本文就給大家介紹幾種Java遍歷Map對(duì)象的方法,并簡(jiǎn)單分析一下每種方法的效率,需要的朋友可以參考下

前言

大家平時(shí)在使用Java開發(fā)時(shí),經(jīng)常會(huì)遇到遍歷Map對(duì)象的問(wèn)題。本文就給大家介紹幾種Java遍歷Map對(duì)象的方法,并簡(jiǎn)單分析一下每種方法的效率。

首先創(chuàng)建一個(gè)Map對(duì)象,初始值為3條數(shù)據(jù),用于測(cè)試代碼的編寫

Map<String,String> map = new HashMap<String,String>();
map.put("1","張三");
map.put("2","李四");
map.put("3","王五")

一、for循環(huán) + Entryset

首先通過(guò)map.entrySet()方法,可以獲取到一個(gè)Set集合,這個(gè)集合中的每一個(gè)元素就是Map中的一個(gè)鍵值對(duì)。然后通過(guò)循環(huán)遍歷這個(gè)Set集合,可以依次取出每對(duì)的鍵和值。該方法使用了foreach循環(huán),代碼簡(jiǎn)潔明了,且能獲取Map的鍵和值,是最常見且多數(shù)情況最可取的遍歷方式。

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

注意:for-each循環(huán)在java 5中被引入。所以該方法只能應(yīng)用于java 5及以上版本。如果遍歷Map是null,for-each循環(huán)將拋出NullPointerException,因此在遍歷前需要檢查空引用。

二、Iterator + Entryset

Entry是Map接口的內(nèi)部接口,獲取迭代器,然后循環(huán)依次取出每個(gè)迭代器里面的Entry,再通過(guò)Entry取出每個(gè)鍵值對(duì)。該種方法看起來(lái)冗余,卻是老版本java中遍歷map的唯一方式。第一種遍歷方法其實(shí)是這種方法通過(guò)語(yǔ)法糖做的一種編碼方式,其本質(zhì)是一樣的。所以在性能方面,兩種方法基本相同。另外,如果在遍歷過(guò)程中,有刪除某些鍵值對(duì)的需求,需要使用這種遍歷方式。

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

三、for循環(huán) + KeySet(效率低)

通過(guò)map.keySet()方法可以獲取Map的所有key的集合(set)。然后通過(guò)遍歷這個(gè)Set就可以遍歷到Map的key,如果想要同時(shí)遍歷到Map的value,則需要進(jìn)一步通過(guò)key來(lái)從Map這個(gè)集合中獲取對(duì)應(yīng)的value?!静煌扑],只能獲取key,要想獲取對(duì)應(yīng)的value,需要重復(fù)計(jì)算】

for (String key : map.keySet()) {
    System.out.println("key:" + key + ",");
    System.out.println("value:" + map.get(key));
}

這個(gè)代碼看上去比方法二簡(jiǎn)潔,但實(shí)際上效率非常低。因?yàn)閺逆I取值是耗時(shí)的操作(與方法一、二相比,在不同的Map實(shí)現(xiàn)中該方法慢了20%~200%,所以盡量避免使用。

四、Iterator + Keyset(效率低)

與第三種方法類似,只是將循環(huán)遍歷換成了迭代器。性能提升微乎其微,同樣不推薦使用。

Iterator<String> iterator=map.keySet().iterator();
while (iterator.hasNext()){
    String key = iterator.next();
    System.out.println(key);
    System.out.println(map.get(key));
}

五、lambda表達(dá)式

從Java8開始,Java提供了對(duì)Lambda表達(dá)式的支持,通過(guò)Lambda表達(dá)式可以使代碼更簡(jiǎn)潔,這其中就包括用Lambda表達(dá)式實(shí)現(xiàn)遍歷Map的功能。

map.forEach((key,value)->{
    System.out.println(key);
    System.out.println(value);
});

Lambda表達(dá)式的forEach方法,其實(shí)就是一種語(yǔ)法糖,可以讓代碼更加簡(jiǎn)潔,使用更加方便。查看源碼,我們可以發(fā)現(xiàn),這種方式也是對(duì)entrySet遍歷方式的一種包裝。

六、Stream流

map.entrySet().stream().forEach((Map.Entry<Integer, String> entry) -> {
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
});

總結(jié)

1.EntrySet的方式比KeySet性能要好,原因在于keySet相當(dāng)于遍歷了2次。

2.map.get(key)是計(jì)算密集型操作,很耗費(fèi)CPU。

3.EntrySet的Iterator遍歷的效率比f(wàn)or循環(huán)效率更好。

4.lambda 表達(dá)式和Entryset的底層原理相同,且語(yǔ)法更加簡(jiǎn)潔。

結(jié)論:JAVA8以下推薦使用方法一、二,JAVA8及以上,推薦使用方法五。

到此這篇關(guān)于Java遍歷Map的方法匯總的文章就介紹到這了,更多相關(guān)Java遍歷Map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis實(shí)現(xiàn)CRUD的示例代碼

    MyBatis實(shí)現(xiàn)CRUD的示例代碼

    本文主要介紹了MyBatis實(shí)現(xiàn)CRUD的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 學(xué)習(xí)Java的static與final關(guān)鍵字

    學(xué)習(xí)Java的static與final關(guān)鍵字

    本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識(shí)點(diǎn)以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。
    2018-03-03
  • springboot項(xiàng)目main函數(shù)啟動(dòng)的操作

    springboot項(xiàng)目main函數(shù)啟動(dòng)的操作

    這篇文章主要介紹了springboot項(xiàng)目main函數(shù)啟動(dòng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略

    淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略

    這篇文章主要介紹了淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java中new與clone操作對(duì)象的比較方法舉例

    Java中new與clone操作對(duì)象的比較方法舉例

    這篇文章主要給大家介紹了關(guān)于Java中new與clone操作對(duì)象的比較方法,在java中對(duì)象的誕生是我們開發(fā)人員new出來(lái)的,對(duì)象的使用也是我們開發(fā)人員進(jìn)行操作的,需要的朋友可以參考下
    2024-07-07
  • SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析

    SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析

    這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • ZooKeeper官方文檔之Java案例解讀

    ZooKeeper官方文檔之Java案例解讀

    ZooKeeper官方提供了一個(gè)Java監(jiān)聽的例子,本文是我對(duì)該例子的學(xué)習(xí)筆記??梢宰鰹閹椭斫獯死拥馁Y料,有需要的朋友可以借鑒參考下
    2022-01-01
  • mybatis中foreach報(bào)錯(cuò):_frch_item_0 not found的解決方法

    mybatis中foreach報(bào)錯(cuò):_frch_item_0 not found的解決方法

    這篇文章主要給大家介紹了mybatis中foreach報(bào)錯(cuò):_frch_item_0 not found的解決方法,文章通過(guò)示例代碼介紹了詳細(xì)的解決方法,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-06-06
  • java面試常見模式問(wèn)題---代理模式

    java面試常見模式問(wèn)題---代理模式

    代理模式是常用的java設(shè)計(jì)模式,他的特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過(guò)濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息
    2021-06-06
  • Java?NIO?中?Selector?解析

    Java?NIO?中?Selector?解析

    這篇文章主要介紹了Java?NIO?中?Selector,Selector即選擇器,選擇器提供選擇執(zhí)行已經(jīng)就緒的任務(wù)的能力即為翻譯為多路復(fù)用,下面文章對(duì)Selector詳細(xì)介紹內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論