您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
一位不愿透露姓名的用户 发布于2019年12月09日 00:17 最近更新于 2019年12月09日 19:46

在 Java 中遍历迭代一个Map集合的最佳方式是什么?

1800 次浏览 读完需要≈ 1 分钟 Java

在 Java 中,Map是键值对的集合。

遍历一个Map集合好像有多种方式,请教一下,使用哪一种方式来迭代遍历Map集合中的元素会比较好呢?

1 个回答

Ready · 4年前

在Java中,要遍历一个集合,有多种方式。

【方式①】:通过迭代 Map 的 Map.keySet()来迭代key,再根据 key 获取 value

/**
 * 【方式一】:先遍历 Map 集合的 key,再根据 key 获取 value
 *
 * @param map 不能为 null
 */
public <K, V> void iterateMap(@Nonnull Map<K, V> map) {
	for (K key : map.keySet()) {
		V value = map.get(key);
		// do something with key and value
	}
}

【方式②】:如果只需要遍历 Map 的 value,只需要直接迭代 Map.values()

/**
 * 【方式二】:如果只需要遍历 Map 的 value,只需要直接遍历 values()
 *
 * @param map 不能为 null
 */
public <K, V> void iterateMap(@Nonnull Map<K, V> map) {
	for (V value : map.values()) {
		// do something with value
	}
}

【方式③】:通过迭代Map.entrySet()来遍历 Map 集合。

/**
 * 【方式三】:通过 entrySet() 来遍历 Map 集合
 *
 * @param map 不能为 null
 */
public <K, V> void iterateMap(@Nonnull Map<K, V> map) {
	for (Entry<K, V> entry : map.entrySet()) {
		K key =  entry.getKey();
		V value = entry.getValue();
		// do something with key and value
	}
}

毫无疑问:

  • 如果你只需要遍历 key,那可以选择 方式 ① 和 方式 ③;
  • 如果你只需要遍历 value,那你可以选择 方式 ② 和 方式 ③;
  • 如果你需要同时遍历 keyvalue,那么你应该选择 方式 ③ !

因为在 Map 的各种实现上,在其底层都是以 Map.Entry<K, V> 为一个基本单元进行存储的。

以我们常用的java.util.HashMap为例:

其底层就是用一个Map.Entry<K, V>数组 + 双向数据链 作为存储数据的数据结构。我们遍历一次该Map集合,实质上是在遍历该数组及每个数组元素上的数据链。

如果使用 方式 ①,我们遍历一次 Map.keySet() 实际上就遍历了一遍底层的 数组 + 链表。如果每次都要再通过Map.get( key )来获取对应的value ,实际上每次都还要在 HashMap 上进行一次 hash计算,并通过计算出的 hash 值在对应的元素链上进行查找,这会导致相对比较严重的不必要的性能开销。

因此我们推荐使用 方式 ② 和 方式 ③ 来遍历 Map 集合;如果同时需要遍历keyvalue,则只推荐使用方式 ③。

此外,如果你使用的是 Java 8+,那么我们更推荐使用为 Lambda 表达式 新增的Map.forEach()方法来遍历:

/**
 * 【方式四】:通过 forEach() 来遍历 Map 集合
 *
 * @param map 不能为 null
 */
public <K, V> void iterateMap(@Nonnull Map<K, V> map) {
	map.forEach((key, value) -> {
		// do something with key and value
	});
}

撰写答案