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

吉米:

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

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

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

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

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

TJ Crowder:

两种选择:

选项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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

迭代时如何仅在 ArrayList 中避免 ConcurrentModificationException?

如何在迭代时从“ ArrayList”中删除元素时避免“ ConcurrentModificationException”?

如何在从LinkedList进行基于递归迭代器的删除时避免ConcurrentModificationException?

迭代时更改值

如何迭代地图以避免NPE?

尝试更新地图键和值时发生ConcurrentModificationException

如何在并发线程中处理`values()`和`put()`时如何避免HashMap“ ConcurrentModificationException”?

在遍历和删除ArrayList中的元素时如何避免java.util.ConcurrentModificationException

如何在JPA和Hibernate中合并实体时避免java.util.ConcurrentModificationException

在 Rails 中使用迭代和枚举时更改显示值?

迭代器和ConcurrentModificationException

迭代时更改字典值

如何使用Java 8流和Lambda迭代和处理其值是元素列表的地图的值

在Rust中迭代时如何更改数组内的值

如何避免ConcurrentModificationException Kotlin

如何避免在地图迭代块中创建多个新函数

如何从到的ArrayLists移除对象时避免ConcurrentModificationException的”

如何在迭代时从地图中删除?

如何在删除项目时迭代地图?

检查JSONobject的值时如何停止ConcurrentModificationException

如何在迭代期间添加项目时修复ConcurrentModificationException错误

迭代器如何在添加时引发ConcurrentModificationException

当某些值被忽略时,如何避免迭代器实现中不必要的昂贵操作?

如何在Node中使用for..of迭代地图的键和值?

如何在Go html模板中迭代地图的键和值

迭代时更改 JSON 中键的值

如何更改地图的键和值以更改其大小写

Jmeter-迭代和更改文件值

递归:如何避免在迭代RuntimeError期间更改Python集