Java遍歷Map的方法匯總
前言
大家平時在使用Java開發(fā)時,經(jīng)常會遇到遍歷Map對象的問題。本文就給大家介紹幾種Java遍歷Map對象的方法,并簡單分析一下每種方法的效率。
首先創(chuàng)建一個Map對象,初始值為3條數(shù)據(jù),用于測試代碼的編寫
Map<String,String> map = new HashMap<String,String>();
map.put("1","張三");
map.put("2","李四");
map.put("3","王五")一、for循環(huán) + Entryset
首先通過map.entrySet()方法,可以獲取到一個Set集合,這個集合中的每一個元素就是Map中的一個鍵值對。然后通過循環(huán)遍歷這個Set集合,可以依次取出每對的鍵和值。該方法使用了foreach循環(huá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)依次取出每個迭代器里面的Entry,再通過Entry取出每個鍵值對。該種方法看起來冗余,卻是老版本java中遍歷map的唯一方式。第一種遍歷方法其實是這種方法通過語法糖做的一種編碼方式,其本質(zhì)是一樣的。所以在性能方面,兩種方法基本相同。另外,如果在遍歷過程中,有刪除某些鍵值對的需求,需要使用這種遍歷方式。
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(效率低)
通過map.keySet()方法可以獲取Map的所有key的集合(set)。然后通過遍歷這個Set就可以遍歷到Map的key,如果想要同時遍歷到Map的value,則需要進(jìn)一步通過key來從Map這個集合中獲取對應(yīng)的value。【不推薦,只能獲取key,要想獲取對應(yīng)的value,需要重復(fù)計算】
for (String key : map.keySet()) {
System.out.println("key:" + key + ",");
System.out.println("value:" + map.get(key));
}這個代碼看上去比方法二簡潔,但實際上效率非常低。因為從鍵取值是耗時的操作(與方法一、二相比,在不同的Map實現(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提供了對Lambda表達(dá)式的支持,通過Lambda表達(dá)式可以使代碼更簡潔,這其中就包括用Lambda表達(dá)式實現(xiàn)遍歷Map的功能。
map.forEach((key,value)->{
System.out.println(key);
System.out.println(value);
});Lambda表達(dá)式的forEach方法,其實就是一種語法糖,可以讓代碼更加簡潔,使用更加方便。查看源碼,我們可以發(fā)現(xiàn),這種方式也是對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)是計算密集型操作,很耗費(fèi)CPU。
3.EntrySet的Iterator遍歷的效率比for循環(huán)效率更好。
4.lambda 表達(dá)式和Entryset的底層原理相同,且語法更加簡潔。
結(jié)論:JAVA8以下推薦使用方法一、二,JAVA8及以上,推薦使用方法五。
到此這篇關(guān)于Java遍歷Map的方法匯總的文章就介紹到這了,更多相關(guān)Java遍歷Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)Java的static與final關(guān)鍵字
本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識點以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。2018-03-03
淺談Spring Boot: 接口壓測及簡要優(yōu)化策略
這篇文章主要介紹了淺談Spring Boot: 接口壓測及簡要優(yōu)化策略,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot Redis緩存數(shù)據(jù)實現(xiàn)解析
這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
mybatis中foreach報錯:_frch_item_0 not found的解決方法
這篇文章主要給大家介紹了mybatis中foreach報錯:_frch_item_0 not found的解決方法,文章通過示例代碼介紹了詳細(xì)的解決方法,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-06-06

