使用流时 for 循环内部更改列表的值

Value of list changing inside for loop while using stream

提问人:shashwat 提问时间:11/15/2023 最后编辑:Chaosfireshashwat 更新时间:11/15/2023 访问量:53

问:

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的值不断变化,但L(即哈希集)的值也在变化,我认为一旦我们分配了一个变量,它的值就不会在堆栈中改变,为什么会这样?

我原以为 Set 保持不变,而我们正在更改 locMap

Java Spring-Boot

评论

0赞 Robin Camus 11/15/2023
不确定,你是想要哲学还是具体的事实,但 KeySet() 方法返回 Map 中的实际 Set,而不是它的克隆。github.com/AdoptOpenJDK/openjdk-jdk8u/blob/master/jdk/src/share/......

答:

2赞 Georgii Lvov 11/15/2023 #1

由于 的实现,它被更改了。来自 javadoc 的 :keySet()HashMap#keySet

返回此映射中包含的键的 Set 视图。该集合是 在地图的支持下,因此对地图的更改将反映在集合中,并且 反之亦然。

要保持该值不变,您需要根据 locMap 的键集创建一个新集:

Set<String> l = new HashSet<>(locMap.keySet());