3 回答
TA贡献1828条经验 获得超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进行删除。
TA贡献1780条经验 获得超1个赞
从引用中提取如何在Java中迭代Map:
有几种方法可以迭代Map
在爪哇。让我们回顾一下最常用的方法,并回顾它们的优缺点。由于Java中的所有映射都实现了Map接口,所以以下技术将适用于任何地图实现(HashMap
, TreeMap
, LinkedHashMap
, Hashtable
等等)
方法1使用for-each循环迭代条目。
这是最常见的方法,在大多数情况下更可取。如果您需要循环中的映射键和值,则应该使用它。
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循环是在Java 5中引入的,因此该方法仅适用于新版本的语言。每个循环都会抛出NullPointerException
如果您试图在一个为空的映射上迭代,那么在迭代之前,您应该始终检查空引用。
方法2:使用for-each循环迭代键或值。
如果只需要映射中的键或值,则可以迭代键集或值,而不是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);}
这种方法比传统的方法具有较小的性能优势。entrySet
迭代(大约快10%)并且更干净。
方法3使用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
或者价值观。
这种方法看起来可能是多余的,但它有自己的优点。首先,它是在旧版本的Java中迭代映射的唯一方法。另一个重要的特性是,它是允许您在迭代期间通过调用iterator.remove()
..如果您在每次迭代中尝试这样做,您将得到“不可预测的结果”。
从性能的角度来看,此方法等于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的一个更干净的替代方案,但实际上它非常慢,而且效率很低,因为通过键获取值可能很费时(在不同的Map实现中,这种方法比方法1慢20%-200%)。如果安装了FindBugs,它将检测到这一点,并警告您注意效率低下的迭代。这种方法应该避免。
结论:
如果只需要映射中的键或值,请使用方法2。如果您使用了Java的旧版本(小于5),或者计划在迭代期间删除条目,则必须使用方法3。否则使用方法1。
添加回答
举报