簡體   English   中英

Java HashMap在迭代時添加新條目

[英]Java HashMap add new entry while iterating

在 HashMap 中

map = new HashMap<String,String>();

it = map.entrySet().iterator();
while (it.hasNext())
{
    entry = it.next();
    it.remove(); //safely remove a entry
    entry.setValue("new value"); //safely update current value
    //how to put new entry set inside this map
    //map.put(s1,s2); it throws a concurrent access exception

}

當我嘗試添加一個新條目來映射時,它會拋出ConcurrentModificationException 對於刪除和更新迭代器具有安全刪除方法。 如何在迭代時添加新條目?

您需要考慮在迭代時將值放入 M​​ap 意味着什么。 HashMap 沒有定義其條目將被迭代的順序。 因此,當您放置新條目時,該條目是否應該稍后由迭代器返回。 行為的一致性很重要。 但是,無論您決定采用哪種方式,當您將新值放入預先存在的鍵時都會出現不一致的行為。 如果該鍵已經被迭代,那么更改將不會出現,並且如果該鍵尚未由迭代器生成,則該更改將出現。

解決這個問題的一個簡單方法是為新的鍵值對創建一個臨時 Map,並在迭代結束時將臨時 Map 添加到主 Map。

Map<String,String> values = ...

Map<String,String> temp = new HashMap<>();
for (Entry<String,String> entry : values.entrySet()) {
    if ("some value".equals(entry.getValue()) {
        temp.put(entry.getValue(), "another value");
    }
}
values.putAll(temp);

您需要在迭代集合時使用ConcurrentHashMap添加元素。 HashMap 使用快速失敗迭代器,它在迭代時更新集合時拋出 ConcurrentModificationException。 ConcurrentHashMap使用故障安全迭代器,它基本上適用於底層集合的克隆,因此允許在迭代時進行修改。

怎么樣:

map = new HashMap<String,String>();

it = map.entrySet().iterator();
while (it.hasNext())
{
    entry = it.next();
    entry.setValue("new value"); // update current value
}

我檢查了 HashMap 實現,它在更新這樣的條目時不會更改其修改計數。 我也認為沒有理由不允許這樣做。 沒有刪除任何內容,沒有添加任何內容,也沒有更改任何密鑰。

我所做的是用當前元素創建一個數組,然后遍歷該數組:

Feature[] initialFeatures = featureMap.values().toArray(new Feature[featureMap.values().size()]);

for (Feature feature : initialFeatures)
{/* Code that can safely add to the featureMap */}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM