【问题标题】:Changing MultivalueMap keys throws ConcurrentModificationException [duplicate]更改 MultivalueMap 键会引发 ConcurrentModificationException [重复]
【发布时间】:2019-06-24 21:17:56
【问题描述】:

我有 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);
}  

【问题讨论】:

  • 重复的大约是Lists,但每个Collection也是如此,就像你的情况一样Set

标签: java concurrentmodification multivalue


【解决方案1】:

您无法修改正在迭代的基础集合。 您正在循环遍历映射的keySet,并在循环中尝试更改该映射,这也会改变 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);
}  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多