【发布时间】:2015-04-21 10:19:48
【问题描述】:
我想更改地图的特定源键名称的键,并且我想找到一种方法来就地修改它,这样它就不会在这样做时复制东西。我已经知道我只能通过使用 only Iterator 进行迭代来删除地图的条目。但是当我在迭代地图时把东西放回地图时。这是不可能的。无论如何,我会把我的示例代码放在下面,希望有人能给我一个提示。
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" 并保持其值不变。但是这段代码sn-p会报异常:
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() 合并更改。
-
从地图中移除一个值,同时迭代它会导致这个异常
-
@Lucky 我知道这可能是您提到的问题的例外情况,但我只想找到一种方法来做到这一点:-D
标签: java dictionary