java hashMap并发修改异常

时间:2011-11-28 14:33:46

标签: java concurrency

假设您有HashMap m 并且里面已经有一个键值对<"key1", object>

你能做到以下几点吗?

m.put("newkey", m.remove("key1"))

你会得到ConcurrentModificationException吗?

4 个答案:

答案 0 :(得分:7)

只要它不在遍历hashMap条目的循环体中,就可以这样做。可行的方法是remove操作将在put操作之前执行并完成,因此它在语义上等同于在2行中执行它。

答案 1 :(得分:1)

刚刚为你测试过。

Map<String, Object> map = new HashMap<String, Object>();        
map.put("k1", Integer.valueOf(999));        
map.put("k2", map.remove("k1"));
System.out.println(map.get("k2"));

打印:

999

无异常(ConcurrentModificationException)。

答案 2 :(得分:0)

由于m.remove返回先前与该键关联的对象,因此您应该能够使用该对象。所以不,我不相信你应该得到例外。

答案 3 :(得分:0)

它们实际上不是同时发射的。首先调用remove,然后调用,然后调用get,所以我没有理由知道为什么会有异常。

如果需要在循环时修改,请参阅此处: Iterate through a HashMap