更改MultivalueMap键会引发ConcurrentModificationException

时间:2019-01-31 12:00:37

标签: java concurrentmodification multivalue

我有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 个答案:

答案 0 :(得分: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);
}