我想更改地圖的特定原始關鍵字名稱的關鍵字,並且我想找到一種方法對其進行恰當的修改,以便在做這件事時不會複製它。我已經知道我只能通過迭代使用而不是 a Iterator
來刪除地圖條目。但是當我重複地圖的時候把東西放回地圖。它不能做到。無論如何,我會把我的示例代碼放在下面,希望有人能給我一些提示。有沒有辦法使用java就地更改地圖的鍵?
public class TestMapModify {
public static void main(String[] argvs){
Map<String, Object> m = new HashMap<String, Object>();
m.put("a",1);
m.put("b",2);
for(Iterator<Map.Entry<String, Object>> it = m.entrySet().iterator();it.hasNext();){
Map.Entry<String, Object> entry = it.next();
if(entry.getKey().equals("a")){
m.put("c", entry.getValue());
it.remove();
}
}
System.out.println(m);
}
}
在上面的代碼,我想關鍵"a"
更改爲"c"
,離開它的值不變。但是,此代碼段會給出一個例外:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.remove(HashMap.java:944)
at me.armnotstrong.TestMapModify.main(TestMapModify.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
編輯
我知道是什麼導致這個問題,但我想找到「最佳」或替代的方式來做到這一點。
除了通過迭代器以外的任何修改都會使迭代器失效。在迭代完成後使用putAll()合併更改,收集要重定位到新地圖的條目。 – Durandal
從地圖上刪除值時,如果迭代它,將導致此異常 – Lucky
使用https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html? –