日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java Map及Map.Entry详解

發(fā)布時間:2024/9/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java Map及Map.Entry详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Map是java中的接口,Map.Entry是Map的一個內(nèi)部接口。

Map提供了一些常用方法,如keySet()、entrySet(),values()等方法。

keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個Set集合,此集合的類型為Map.Entry。

Map.Entry是Map聲明的一個內(nèi)部接口,此接口為泛型,定義為Entry<K,V>。它表示Map中的一個實體(一個key-value對)。接口中有g(shù)etKey(),getValue方法。(entry的英文意思是 “記錄“)

?????????

????????由以上可以得出,遍歷Map的常用方法:

???????1.??Map?map?=?new?HashMap();

???????????Irerator?iterator?=?map.entrySet().iterator();

???????????while(iterator.hasNext())?{

???????????????????Map.Entry?entry?=?iterator.next();

???????????????????Object?key?=?entry.getKey();

???????????????????//

???????????}

???????2.Map?map?=?new?HashMap();?

???????????Set??keySet=?map.keySet();

???????????Irerator?iterator?=?keySet.iterator;

???????????while(iterator.hasNext())?{

???????????????????Object?key?=?iterator.next();

???????????????????Object?value?=?map.get(key);

???????????????????//

???????????}

?

???????另外,還有一種遍歷方法是,單純的遍歷value值,Map有一個values方法,返回的是value的Collection集合。通過遍歷collection也可以遍歷value,如

??????Map?map?=?new?HashMap();

??????Collection?c?=?map.values();

??????Iterator?iterator?=?c.iterator();

??????while(iterator.hasNext())?{

?????????????Object?value?=?iterator.next();?

?????}

?

?

?

在Java中如何遍歷Map對象

How to Iterate Over a Map in Java

在java中遍歷Map有不少的方法。我們看一下最常用的方法及其優(yōu)缺點。

既然java中的所有map都實現(xiàn)了Map接口,以下方法適用于任何map實現(xiàn)(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)

?

方法一 在for-each循環(huán)中使用entries來遍歷

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

[java]?view plain?copy

?

  • 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)在java 5中被引入所以該方法只能應(yīng)用于java 5或更高的版本中。如果你遍歷的是一個空的map對象,for-each循環(huán)將拋出NullPointerException,因此在遍歷前你總是應(yīng)該檢查空引用。

    ?

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

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

    [java]?view plain?copy

    ?

  • 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遍歷

    使用泛型:

    [java]?view plain?copy

    ?

  • 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());??
  • ??
  • }??

  • ?

    不使用泛型:

    [java]?view plain?copy

    ?

  • 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)用同樣的方法。

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

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

    ?

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

    [java]?view plain?copy

    ?

  • 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);??
  • ??
  • }??

  • ?

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

    ?

    總結(jié)

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

    來源:https://www.cnblogs.com/keyi/p/5821668.html

    總結(jié)

    以上是生活随笔為你收集整理的java Map及Map.Entry详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。