3 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超4個贊
如果您只對鍵感興趣,則可以遍歷keySet()
地圖:
Map<String,?Object>?map?=?...;for?(String?key?:?map.keySet())?{ ????//?...}
如果您只需要這些值,請使用values()
:
for?(Object?value?:?map.values())?{ ????//?...}
最后,如果要同時使用鍵和值,請使用entrySet()
:
for?(Map.Entry<String,?Object>?entry?:?map.entrySet())?{ ????String?key?=?entry.getKey(); ????Object?value?=?entry.getValue(); ????//?...}
請注意:如果要在迭代過程中刪除項,則需要通過Iterator進(jìn)行刪除。

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊
從引用中提取如何在Java中迭代Map:
有幾種方法可以迭代Map
在爪哇。讓我們回顧一下最常用的方法,并回顧它們的優(yōu)缺點。由于Java中的所有映射都實現(xiàn)了Map接口,所以以下技術(shù)將適用于任何地圖實現(xiàn)(HashMap
,?TreeMap
,?LinkedHashMap
,?Hashtable
等等)
方法1使用for-each循環(huán)迭代條目。
這是最常見的方法,在大多數(shù)情況下更可取。如果您需要循環(huán)中的映射鍵和值,則應(yīng)該使用它。
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中引入的,因此該方法僅適用于新版本的語言。每個循環(huán)都會拋出NullPointerException
如果您試圖在一個為空的映射上迭代,那么在迭代之前,您應(yīng)該始終檢查空引用。
方法2:使用for-each循環(huán)迭代鍵或值。
如果只需要映射中的鍵或值,則可以迭代鍵集或值,而不是entrySet。
Map<Integer,?Integer>?map?=?new?HashMap<Integer,?Integer>();//?Iterating?over?keys?onlyfor?(Integer?key?:?map.keySet())?{ ????System.out.println("Key?=?"?+?key);}//?Iterating?over?values?onlyfor?(Integer?value?:?map.values())?{ ????System.out.println("Value?=?"?+?value);}
這種方法比傳統(tǒng)的方法具有較小的性能優(yōu)勢。entrySet
迭代(大約快10%)并且更干凈。
方法3使用Iterator進(jìn)行迭代。
使用泛型:
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);}
您也可以使用相同的技術(shù)來迭代。keySet
或者價值觀。
這種方法看起來可能是多余的,但它有自己的優(yōu)點。首先,它是在舊版本的Java中迭代映射的唯一方法。另一個重要的特性是,它是允許您在迭代期間通過調(diào)用iterator.remove()
..如果您在每次迭代中嘗試這樣做,您將得到“不可預(yù)測的結(jié)果”。
從性能的角度來看,此方法等于for-每一次迭代。
方法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);}
這可能看起來是方法1的一個更干凈的替代方案,但實際上它非常慢,而且效率很低,因為通過鍵獲取值可能很費(fèi)時(在不同的Map實現(xiàn)中,這種方法比方法1慢20%-200%)。如果安裝了FindBugs,它將檢測到這一點,并警告您注意效率低下的迭代。這種方法應(yīng)該避免。
結(jié)論:
如果只需要映射中的鍵或值,請使用方法2。如果您使用了Java的舊版本(小于5),或者計劃在迭代期間刪除條目,則必須使用方法3。否則使用方法1。
添加回答
舉報