在 Java 中,Map
是键值对的集合。
遍历一个Map
集合好像有多种方式,请教一下,使用哪一种方式来迭代遍历Map
集合中的元素会比较好呢?
在 Java 中,Map
是键值对的集合。
遍历一个Map
集合好像有多种方式,请教一下,使用哪一种方式来迭代遍历Map
集合中的元素会比较好呢?
在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
}
}
毫无疑问:
因为在 Map 的各种实现上,在其底层都是以 Map.Entry<K, V>
为一个基本单元进行存储的。
以我们常用的java.util.HashMap
为例:
其底层就是用一个Map.Entry<K, V>
数组 + 双向数据链 作为存储数据的数据结构。我们遍历一次该Map集合,实质上是在遍历该数组及每个数组元素上的数据链。
如果使用 方式 ①,我们遍历一次 Map.keySet()
实际上就遍历了一遍底层的 数组 + 链表。如果每次都要再通过Map.get( key )
来获取对应的value ,实际上每次都还要在 HashMap 上进行一次 hash计算,并通过计算出的 hash 值在对应的元素链上进行查找,这会导致相对比较严重的不必要的性能开销。
因此我们推荐使用 方式 ② 和 方式 ③ 来遍历 Map 集合;如果同时需要遍历key和value,则只推荐使用方式 ③。
此外,如果你使用的是 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
});
}