java hashmap 通过 values 遍历最直接的方式是调用 values() 方法获取 collection<v></v> 视图,然后使用增强 for 循环或迭代器进行遍历。这种方式只关注值而不涉及键,适合只需要处理值的场景。需要注意的是,values() 返回的集合支持移除操作,但直接修改原 map 的结构(如添加新键值对)在遍历时会抛出 concurrentmodificationexception。

values() 返回的集合类型与基本用法
values() 方法返回的是 HashMap.ValuesView 内部类实例,它实现了 Collection<v></v> 接口。这意味着你可以像操作普通集合一样对它进行遍历、过滤或转换。最基础的用法就是将其作为目标传入增强 for 循环中,代码简洁且可读性高。

import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
// 通过 values() 获取值集合并遍历
for (Integer value : map.values()) {
System.out.println(value);
}
}
}
运行上述代码,控制台将依次输出 1 和 2。由于 HashMap 不保证顺序,输出顺序可能与插入顺序不同。这种遍历方式不涉及键,因此无法在遍历过程中根据键来过滤值,如果需要基于键的条件过滤,应改用 entrySet()。
立即学习“Java免费学习笔记(深入)”;
结合 Stream API 进行值处理
在现代 Java 开发中,常结合 Stream API 对 values() 返回的集合进行更复杂的处理,例如过滤、映射或收集。这种方式函数式风格明显,适合链式操作。通过 map.values().stream() 可以获取一个流,进而执行各种中间操作和终端操作。

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 10);
map.put("B", 20);
map.put("C", 30);
// 过滤出大于 15 的值并收集为列表
var result = map.values().stream()
.filter(v -> v > 15)
.collect(Collectors.toList());
System.out.println(result); // 输出 [20, 30]
}
}
该示例展示了如何从 HashMap 中提取值并进行筛选。首先调用 values() 获取值集合,接着转换为流,使用 filter 保留大于 15 的元素,最后用 collect 收集为 List。这种方法避免了显式循环,代码更紧凑。注意,如果需要对值进行修改后写回原 Map,此方法并不适用,因为流操作通常产生新集合而非修改原对象。
遍历时移除元素的安全做法
在使用 values() 遍历并尝试移除元素时,必须使用迭代器的 remove() 方法,否则直接调用集合的 remove() 会引发并发修改异常。这是因为增强 for 循环底层依赖迭代器,但其语法不允许直接访问迭代器实例,从而无法安全调用 remove()。正确做法是手动获取迭代器并在循环中调用其 next() 和 remove()。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
Iterator<Integer> it = map.values().iterator();
while (it.hasNext()) {
Integer value = it.next();
if (value == 2) {
it.remove(); // 安全移除
}
}
System.out.println(map.size()); // 输出 2
}
}
上述代码中,通过 map.values().iterator() 获取迭代器,在循环中检查每个值,当值为 2 时调用 it.remove() 从底层 Map 中移除对应条目。这是唯一安全的移除方式,因为迭代器的 remove() 方法会同步更新 Map 的内部结构,避免状态不一致。若使用增强 for 循环中的 map.values().remove(2),将在第二次迭代时抛出 ConcurrentModificationException。


















