Java中遍历循环用Stream时keySet随原Map变更的原因咨询
Set<String> l = locMap.keySet(); for (Map.Entry<String, String> ven : venderAndFactoryLocMap.entrySet()) { if (ven.getValue().equals(VENDOR)) { Map<String, String> x1 = l.stream().collect(Collectors.toMap(x -> x + "-" + ven.getKey(), x -> PROCESS)); locMap.putAll(x1); } }
在上述代码中,修改locMap的同时,由locMap.keySet()赋值得到的Set对象l也发生了变化。我原本认为变量赋值后栈中的值不会改变,请问为何会出现这种现象?我预期修改locMap时该Set能保持恒定不变。
问题原因解析
这是因为Java里Map.keySet()返回的不是独立的集合副本,而是原Map的键集视图。
- 栈中变量
l的引用值确实固定不变,但这个引用指向的对象是和原locMap绑定的动态视图。视图的核心特性就是和原Map实时关联,当原Map的键数量、内容变化时,视图会同步更新,不会保存静态的键集合快照。 - 你混淆了两个概念:栈中变量存储的引用值不变,不代表引用指向的对象内容不变。
l的引用始终指向同一个视图对象,但这个对象的内容会跟着原Map动态变化。
解决办法
如果需要让集合保持恒定,需要把keySet转成独立的、与原Map解绑的集合,比如用HashSet复制一份:
Set<String> l = new HashSet<>(locMap.keySet());
此时l是一个独立的静态集合,后续修改locMap不会影响它的内容。
内容的提问来源于stack exchange,提问作者shashwat
相关产品推荐
相关产品推荐

