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

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Java中Map 遍歷的幾種方法(HashMap/TreeMap/LinkedHashMap/Hashtable)

Java中Map 遍歷的幾種方法(HashMap/TreeMap/LinkedHashMap/Hashtable)

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):1488    更新時(shí)間:2018-06-03 15:15   參與評(píng)論

在Java中如何遍歷Map對(duì)象

How to Iterate Over a Map in Java

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

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

 

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

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


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或更高的版本中。如果你遍歷的是一個(gè)空的map對(duì)象,for-each循環(huán)將拋出NullPointerException,因此在遍歷前你總是應(yīng)該檢查空引用。

 

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

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


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

使用泛型:


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

  



不使用泛型:


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ò)鍵找值遍歷(效率低)


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,必須使用方法三。否則使用方法一(鍵值都要)。


另外網(wǎng)友總結(jié)的實(shí)例:

//循環(huán)遍歷map的方法
public class MapF {
 public static void main(String[] args) {
  Map<String, Integer> tempMap = new HashMap<String, Integer>();
  tempMap.put("a","12");
  tempMap.put("b","34");
  tempMap.put("c","56");
  // JDK1.4中
  // 遍歷方法一 hashmap entrySet() 遍歷
  Iterator it = tempMap.entrySet().iterator();
  while (it.hasNext()) {
   Map.Entry entry = (Map.Entry) it.next();
   Object key = entry.getKey();
   Object value = entry.getValue();
   System.out.println("key=" + key + " value=" + value);
  }
  System.out.println("");
  // JDK1.5中,應(yīng)用新特性For-Each循環(huán)
  // 遍歷方法二
  for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
   String key = entry.getKey().toString();
   String value = entry.getValue().toString();
   System.out.println("key=" + key + " value=" + value);
  }
  System.out.println("");
  // 遍歷方法三 hashmap keySet() 遍歷
  for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
   Object obj = i.next();
   System.out.println(obj);// 循環(huán)輸出key
   System.out.println("key=" + obj + " value=" + tempMap.get(obj));
  }
  for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
   Object obj = i.next();
   System.out.println(obj);// 循環(huán)輸出value
  }
  // 遍歷方法四 treemap keySet()遍歷
  for (Object o : tempMap.keySet()) {
   System.out.println("key=" + o + " value=" + tempMap.get(o));
  }
  System.out.println("11111");
  // java如何遍歷Map <String, ArrayList> map = new HashMap <String,
  // ArrayList>();
  System.out.println("java  遍歷Map <String, ArrayList> map = new HashMap<String, ArrayList>();");
  Map<String, ArrayList> map = new HashMap<String, ArrayList>();
  Set<String> keys = map.keySet();
  Iterator<String> iterator = keys.iterator();
  while (iterator.hasNext()) {
   String key = iterator.next();
   ArrayList arrayList = map.get(key);
   for (Object o : arrayList) {
    System.out.println(o);
   }
  }
  Map<String, List> map = new HashMap<String, List>();
  for (Map.Entry entry : map.entrySet()) {
   String key = entry.getKey().toString();
   List<String> list= (List) entry.getValue();
   for (String value : list) {
    System.out.println(key + "====" + value);
   }
  }
 }
}


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

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

其它欄目

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

業(yè)務(wù)咨詢(xún)

· 技術(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)