keySet() 返回原Map的实时视图而非副本,修改它会直接影响原Map,遍历时删除需用Iterator.remove()或批量删除;需副本时应显式创建新集合。

keySet() 返回的是视图,不是新集合
调用 map.keySet() 得到的 Set 是原 Map 的实时视图——它不复制数据,也不脱离原始映射。改它等于改原 Map,删它会触发 ConcurrentModificationException(如果遍历时修改)。
- 想安全遍历并删除某些 key?别直接在
keySet()上调用remove(),改用Iterator.remove()或先收集待删 key 再批量删 - 需要独立副本?显式转成新集合:
new HashSet(map.keySet())或map.keySet().stream().collect(Collectors.toSet()) - 对
TreeMap调用keySet(),返回的是有序SortedSet,但仍是视图——排序行为保留,修改仍联动
Stream 遍历 keySet 时要注意 null 安全和终端操作
map.keySet().stream() 看似简洁,但实际执行依赖 keySet() 的底层实现。比如 HashMap 的 keySet() 流是惰性的,但一旦触发终端操作(如 forEach、collect),就立即反映当前状态;而若 key 本身为 null(仅 HashMap 允许),流中也会包含 null,可能引发 NullPointerException。
- 过滤 null key:
map.keySet().stream().filter(Objects::nonNull).forEach(...) - 避免在流中修改原 map:
map.keySet().stream().map(k -> k + "_suffix").forEach(newKey -> map.put(newKey, "value"))是危险的——可能抛出ConcurrentModificationException或漏处理 - 想按 key 排序后处理?优先用
TreeMap初始化,而不是对普通HashMap的keySet().stream().sorted()——前者 O(1) 获取有序视图,后者每次都是 O(n log n)
for-each vs Stream:性能与可读性取舍点
纯遍历所有 key 时,for (K key : map.keySet()) 比 map.keySet().stream().forEach() 快且内存开销低。Stream 更适合需要链式转换(如 filter-map-collect)、并行或函数式风格的场景。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 简单打印或计数?用 for-each:
for (String k : map.keySet()) { System.out.println(k); } - 要提取前 5 个非空 key 并转大写?Stream 更直白:
map.keySet().stream().filter(Objects::nonNull).map(String::toUpperCase).limit(5).collect(Collectors.toList()) - 并发读多写少?考虑用
ConcurrentHashMap,但注意它的keySet()流不保证强一致性——可能看不到最新插入的 key
不同 Map 实现的 keySet 行为差异
keySet() 接口一致,但各实现类的视图语义和性能表现不同。忽略这点容易在替换实现时出问题。
立即学习“Java免费学习笔记(深入)”;
-
HashMap:keySet()迭代顺序不确定;允许一个nullkey -
LinkedHashMap:保持插入/访问顺序;keySet()迭代顺序与 map 一致 -
TreeMap:天然排序;keySet()是SortedSet,支持first()、headSet()等方法 -
ConcurrentHashMap:keySet()不抛ConcurrentModificationException,但迭代结果可能是弱一致的——看到部分更新,也可能跳过刚插入的项

















