当前位置: 首页 > 知识库问答 >
问题:

更改MultivalueMap键将引发ConcurrentModificationException[duplicate]

罗智刚
2023-03-14

我有MultivalueMap和TreeMap,它们都有String类型的键值。

我希望将MultivalueMap中的任何键更改为TreeMap中的键。

这是我的代码,为什么我会得到ConcurrentModificationException以及如何解决它?

public RestRequest(MultivaluedMap<String, Object> myHeaders,TreeMap<String, String> testParameters) {
    this.testParameters = testParameters;
    buildUrl();     
    Client client = ClientBuilder.newClient();

    Set<String> keys = myHeaders.keySet();
    for (String key : keys) {
        myHeaders.remove(key);
        myHeaders.add(key, testParameters.get(key));
    }
    this.myHeaders = myHeaders;
    myResource = client.target(URL);
    entity=Entity.entity(replaceRequestBodyWithParams(requestBody), MediaType.APPLICATION_JSON);
}  

共有1个答案

朱岳
2023-03-14

您不能修改正在迭代的基础集合。您在映射的keyset上进行循环,并在循环中尝试更改该映射,这也会更改键集。

要实现此方法中所要实现的目标,更好的方法是构造一个新的数据结构,如下所示:

public RestRequest(MultivaluedMap<String, Object> myHeaders,TreeMap<String, String> testParameters) {
    this.testParameters = testParameters;
    buildUrl();     
    Client client = ClientBuilder.newClient();

    Set<String> keys = myHeaders.keySet();
    final Map<String, String> testParamsByHeader = new HashMap<>();

    for (String key : keys)
        testParamsByHeader.add(key, testParameters.get(key));
    }
    this.myHeaders = testParamsByHeader;
    myResource = client.target(URL);
    entity=Entity.entity(replaceRequestBodyWithParams(requestBody), MediaType.APPLICATION_JSON);
}  
 类似资料:
  • 问题内容: 有什么不同之处与使得迭代器不会引发异常而引发异常?最后,两者都在修改集合大小。 请在这里忽略多线程。我只是在谈论一个for-each循环和一个迭代器循环。据我所知,for-each循环仅在内部创建迭代器。 我很困惑。 问题答案: 不会抛出,因为这是在迭代时修改集合的 允许 方式。这是什么的Javadoc的说: 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next()

  • 我使用的是Java14,但我记得它在过去的版本中是有效的。

  • 所有订阅操作都使用以下内容: 所有取消订阅操作都使用以下内容: 和通知者:

  • 我有类A和子类B和C。 我使用inheritanceType.single_table,一列type用作discriminatorColumn。 前面,B类有DiscriminatorValue(“1”),C类有DiscriminatorValue(“2”)。我有大约100多个条目在表中,所有的工作都很好。 会有什么问题?

  • 问题内容: 我有以下代码,我希望它抛出,但运行成功。为什么会这样? 问题答案: 的上方法删除指定位置的元素。在开始循环之前,您的列表如下所示: 然后,在列表上启动迭代器: 您的环然后删除 位置1处的元件 ,这是数字2: 在下一个隐式调用上,迭代器返回,然后循环终止。 如果将更多元素添加到列表中,则会得到一个。然后隐式将抛出。 请注意,从Javadoc 到JCF: 注意,迭代器的快速失败行为无法得到

  • 问题内容: 为什么这段代码不抛出?它在不使用方法的情况下修改了一段时间,这是唯一安全的删除方法。 如果将替换为,则会得到相同的结果。但是,如果我将列表更改为或只是得到了预期的异常。到底是怎么回事?我正在使用是否相关。 编辑 我找到了以下链接 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4902078 相关部分是 天真的解决方案是将协同修改