五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Java/c#遍歷Map對(duì)象的方法集合

Java/c#遍歷Map對(duì)象的方法集合

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):1794    更新時(shí)間:2018-09-20 08:21   參與評(píng)論

關(guān)于java中遍歷map具體哪四種方式,請(qǐng)看下文詳解吧。

方式一 這是最常見(jiàn)的并且在大多數(shù)情況下也是最可取的遍歷方式。在鍵值都需要時(shí)使用。

1

2

3

4

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {

  System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

}

方法二 在for-each循環(huán)中遍歷keys或values。

如果只需要map中的鍵或者值,你可以通過(guò)keySet或values來(lái)實(shí)現(xiàn)遍歷,而不是用entrySet。

1

2

3

4

5

6

7

8

9

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//遍歷map中的鍵

for (Integer key : map.keySet()) {

  System.out.println("Key = " + key);

}

//遍歷map中的值

for (Integer value : map.values()) {

  System.out.println("Value = " + value);

}

該方法比entrySet遍歷在性能上稍好(快了10%),而且代碼更加干凈。

方法三使用Iterator遍歷

使用泛型:

1

2

3

4

5

6

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();

while (entries.hasNext()) {

  Map.Entry<Integer, Integer> entry = entries.next();

  System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

}

不使用泛型:

1

2

3

4

5

6

7

8

Map map = new HashMap();

Iterator entries = map.entrySet().iterator();

while (entries.hasNext()) {

  Map.Entry entry = (Map.Entry) entries.next();

  Integer key = (Integer)entry.getKey();

  Integer value = (Integer)entry.getValue();

  System.out.println("Key = " + key + ", Value = " + value);

}

你也可以在keySet和values上應(yīng)用同樣的方法。

該種方式看起來(lái)冗余卻有其優(yōu)點(diǎn)所在。首先,在老版本java中這是惟一遍歷map的方式。另一個(gè)好處是,你可以在遍歷時(shí)調(diào)用iterator.remove()來(lái)刪除entries,另兩個(gè)方法則不能。根據(jù)javadoc的說(shuō)明,如果在for-each遍歷中嘗試使用此方法,結(jié)果是不可預(yù)測(cè)的。

從性能方面看,該方法類(lèi)同于for-each遍歷(即方法二)的性能。

方法四、通過(guò)鍵找值遍歷(效率低)

1

2

3

4

Map<Integer, Integer> map = new HashMap<Integer, Integer>();

for (Integer key : map.keySet()) {

  Integer value = map.get(key);

  System.out.println("Key = " + key + ", Value = " + value);

作為方法一的替代,這個(gè)代碼看上去更加干凈;但實(shí)際上它相當(dāng)慢且無(wú)效率。因?yàn)閺逆I取值是耗時(shí)的操作(與方法一相比,在不同的Map實(shí)現(xiàn)中該方法慢了20%~200%)。如果你安裝了FindBugs,它會(huì)做出檢查并警告你關(guān)于哪些是低效率的遍歷。所以盡量避免使用。

總結(jié)

如果僅需要鍵(keys)或值(values)使用方法二。如果你使用的語(yǔ)言版本低于java 5,或是打算在遍歷時(shí)刪除entries,必須使用方法三。否則使用方法一(鍵值都要)。



Map 的4種遍歷方式及比較

KeySet

第一種方式: keySet 其實(shí)遍歷了兩次,第一次獲取Iterator,第二次根據(jù)key獲取value,因此性能較差。

    public void testKetSet(Map<String, String> map) {
        Set<String> keys = map.keySet();
        for (String key : keys) { 
            String value =  map.get(key);
            System.out.println("key: "+ key + "  value: " + value );
        }
    }

EntrySet

第二種方式: entrySet 優(yōu)于keySet,因?yàn)橐淮尉桶裬ey和value放入了entry)

  public void testEntrySet(Map<String, String> map) {        
        Set<Map.Entry<String, String>> entry = map.entrySet();
        for (Map.Entry<String, String> stringEntry : entry) {
            System.out.println("key: "+ stringEntry.getKey() + "  value: " + stringEntry.getValue());
        }
    }

Iterator

第三種方式:Iterator (可用 it.remove()在遍歷時(shí)刪除)

 public void testIterator(Map<String, String> map) {
        Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
        while (it.hasNext()) {        
            Map.Entry<String, String> entry1 = it.next();
            System.out.println("key: "+ entry1.getKey() + "  value: " + entry1.getValue());
            //            if ("1".equals(entry1.getKey())) {
            //                it.remove();
            //            }
        }
    }

Lambda (JDK8)

第四種方式:Lambda (本質(zhì)是 entrySet)

 public void testLambda(Map<String, String> map) {   
        map.forEach((key, value) -> {
            System.out.println("key: "+ key + "  value: " + value );
        });
    }

Values

獲取map所有的值,values()返回的是一個(gè)集合 Collection(可轉(zhuǎn)List/Set)

 public void testValues(Map<String, String> map) {
        Collection<String> collection = map.values();
        for (String s : collection) {
            System.out.println("value: " + s);
        }
    }


如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (1794人查看,0條評(píng)論)
請(qǐng)自覺(jué)遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)