当前位置: 首页 > 面试题库 >

迭代地图和更改值时如何避免ConcurrentModificationException?

柳奇希
2023-03-14
问题内容

我有一个包含一些键(字符串)和值(POJO)的地图

我想遍历此映射并更改POJO中的某些数据。

继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。

这不能很好地进行,因为在遍历地图时您不应该修改地图(方法已同步,但ConcurrentModificationException仍然出现)

我的问题是 ,如果我需要遍历地图并更改值,我可以使用的最佳实践/方法是什么?要创建一个单独的地图并按需进行构建,然后返回副本?


问题答案:

两种选择:

选项1

我继承的当前代码将删除给定的条目,并在对POJO进行一些更改后将其重新添加。

您是否要更改对POJO 的 引用 ?例如,因此条目完全指向其他内容吗?因为如果没有的话,根本不需要将其从地图中删除,因此只需对其进行更改。

选项2

如果 确实
需要更改对POJO的引用(例如,条目的值),则仍然可以通过Map.Entry从遍历实例来进行修改entrySet()。您可以setValue在条目上使用它,而不会修改您要遍历的内容。

例:

Map<String,String>                  map;
Map.Entry<String,String>            entry;
Iterator<Map.Entry<String,String>>  it;

// Create the map
map = new HashMap<String,String>();
map.put("one", "uno");
map.put("two", "due");
map.put("three", "tre");

// Iterate through the entries, changing one of them
it = map.entrySet().iterator();
while (it.hasNext())
{
    entry = it.next();
    System.out.println("Visiting " + entry.getKey());
    if (entry.getKey().equals("two"))
    {
        System.out.println("Modifying it");
        entry.setValue("DUE");
    }
}

// Show the result
it = map.entrySet().iterator();
while (it.hasNext())
{
    entry = it.next();
    System.out.println(entry.getKey() + "=" + entry.getValue());
}

输出(无特定顺序)为:

拜访2对其进行
修改
拜访1
拜访3
2 = DUE
one = uno
three = tre

…没有任何修改例外。如果其他人也正在查看/处理该条目,则可能需要同步该条目。



 类似资料:
  • 问题内容: 假设我有以下几种类型: 我想迭代节点的属性以更改它们。 我本来希望能够做到: 但是由于不是指针,所以这行不通,我必须这样做: 有没有更简单或更快速的方法?是否可以直接从中获取指针? 显然,我不想仅仅为了迭代而更改结构,更冗长的解决方案不是解决方案。 问题答案: 不,您想要的缩写是不可能的。 原因是从您要遍历的切片中复制值。关于范围的规范说: value (if 2nd variable

  • 问题内容: 我已经检查了所有其他问题,并发现了相同的错误,但没有找到有帮助的解决方案= / 我有一个字典列表: 其中某些值为空。创建这些列表结束时,我想在返回字典之前删除这些空列表。当前,我正在尝试执行以下操作: 但是,这给了我运行时错误。我知道您无法在字典中进行迭代时添加/删除字典中的元素…那么解决这个问题的方法是什么? 问题答案: 在Python 2.x中,调用会生成密钥的副本,您可以在修改时

  • 问题内容: 我正在尝试从这样的迭代中删除一些元素: 当然,当我尝试同时从列表中删除项目时,我会得到一个提示。有解决此问题的简单方法吗? 问题答案: 使用和致电:

  • 我有一个netwrokx图形,我正在尝试使用删除边来删除图形的边。我想删除原始图形中的每条边,并对其进行后期处理,以获得更多的统计信息,如连接到已删除边的边。 在上面,边在G中被移除。所以对于第二次迭代,原始图不再存在。如何避免这种情况?我想为每次迭代保留原始图,而是将边缘移除后的图存储在另一个副本中,H。 任何建议将不胜感激。 编辑:根据以下建议 打印(G\u copy.edges()) 获得的

  • 问题内容: 我对groovy的了解并没有超出我对Jenkinsfiles的了解。我试图弄清楚是否有可能在Jenkinsfile中定义一个映射,然后可以以“ for循环”方式应用该映射。 我有这些变量: 我的Jenkinsfile中有一个如下所示的: 有没有办法为每个配对做一个舞台?我的尝试还没有运气。 问题答案: Jenkins文档中有一些类似的用户提交的示例。 这样的事情应该起作用:

  • 本文向大家介绍如何避免回调地狱?相关面试题,主要包含被问及如何避免回调地狱?时的应答技巧和注意事项,需要的朋友参考一下 你可以有以下方式避免回调地狱 模块化:将回调函数转换为独立的函数 使用流程控制库,例如[aync] 使用Promise 使用aync/await 使用来计算生成器或Promise 解析:这个问题有很多种答案,取决你使用的场景,例如ES6, ES7,或者一些控制流库。