Java 遍历Map的常用方法

来源:问题来自StackOverflow ,答主arvind引用了这篇博客 列举了几种主要的遍历Map的方法。
翻译一下,作为记录。(顺序有调整)

由于Java中所有的字典都实现了Map接口,所以以下的遍历方法对任何具体字典实现都是适用的(HashMap, TreeMap, etc)。

  • 方法1. 通过For-Each循环来遍历entry
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());
}
  • 方法2.通过For-Each循环来单独遍历key/value
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//遍历Key
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}
//遍历value
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}
  • 方法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);
  • 方法4. 遍历key,搜索value(效率不高)
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 遍历entry map.entrySet() 最常用 For-Each 自Java 5 引入;遍历空的map时抛出NullPointerException(所以应当先检查空性) 需要同时获取key和value的情况
2 只遍历key/value map.keySet(), map.values() 比方法1稍微提升了效率,代码整洁一点 不能同时获得key/value 只需要key/value的时候
3 使用迭代器 map.entrySet.iterator() 旧版本Java唯一遍历字典的方式;唯一能够在迭代时对字典进行删除操作的方法(使用iterator.remove()) 代码略长 旧版本,需要迭代时改变字典内容
4 遍历key,get相应value - - 效率低 不推荐使用

- 结论:

    只需要key/value?
  1. 是 -> 方法2. map.keySet()/map.values()
  2. 否 ->
    1. 需要支持Java 5 之前的版本 / 需要迭代时删除字典项?
    2. 是。 方法3. map.entrySet.iterator()
    3. 否。 方法1. map.entrySet()

你可能感兴趣的:(java,map)