Java 中对 Map 进行遍历的四种方式


如何在 Java 中遍历 Map 对象

方法一:for-each 遍历 entrySet()

使用方法:

  • entrySet():Returns a Set view of the mappings contained in this map.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

for(Map.Entry<Integer, Integer> entry : map.entrySet()){
    System.out.println("key is "+entry.getKey()+"; value is "+entry.getValue());
}

说明:

  • for-each 循环在 java 5 中被引入所以该方法只能应用于java 5 或更高的版本中。
  • 如果遍历的是一个空的 Map 对象,for-each 循环将抛出 NullPointerException。

方法二:for-each 遍历 key 和 value

使用的方法:

  • keySet():Returns a Set view of the keys contained in this map.
  • values():Returns a Collection view of the values contained in this map.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

for(Integer key : map.keySet()){
    System.out.println("key is : "+key);
}

for(Integer value : map.values()){
    System.out.println("value is : "+value);
}

说明:

  • 如果只需要 Map 中的键或者值,则可以通过 keySet 或 values 来实现遍历,而不是用 entrySet。
  • 该方法比 entrySet 遍历在性能上稍好(快了10%),而且代码更加干净。

方法三:使用 iterator 遍历

使用方法:

  • iterator():Returns an iterator over the elements in this set.
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.entrySet<Integer, Integer>> iterator = map.entrySet().iterator();

while(iterator.hashNext()){
    Map.entrySet<Integer, Integer> entry = iterator.next();
    System.out.println("key is "+entry.getKey()+"; value is "+entry.getValue());
}

说明:

  • 可以在 keySet 和 values 上应用同样的方法。
  • 在老版本 java 中这是惟一遍历 Map 的方式。
  • 可以在遍历时调用 iterator.remove() 来删除 entry(如果在 for-each 遍历中尝试使用此方法,结果是不可预测的)。
  • 从性能方面看,该方法类同于 for-each 遍历(即方法二)的性能。

方法四:通过 key 来寻找 value

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

for(Integer key : map.keySet()){
    System.out.println("key is : "+key);
    System.out.println("value is : "+map.get(key));
}

说明:

  • 该方法的效率是最慢的,因为通过 key 来取值是非常慢的。

总结

  • 仅需要键 keys 或值 values 请使用方法二。
  • 如果你使用的语言版本低于java 5,或是打算在遍历时删除 entry ,必须使用方法三。
  • 其他情况下推荐直接使用方法一。