调用putAll时出现ConcurrentModificationException

时间:2013-07-10 22:39:00

标签: java hashmap guava concurrentmodification

我很难理解以下错误。

假设您有一个A类,我在其中实现以下方法:

Map<Double,Integer> get_friends(double user){

Map<Double,Integer> friends = user_to_user.row(user);
//friends.putAll(user_to_user.column(user));

return friends;}

然后在主要内容中我做了以下几点:

A obj = new A();
Map<Double,Integer> temp = obj.get_friends(6);

这很好用。但是,当我取消注释A类中的后续行时:

friends.putAll(user_to_user.column(user));

然后我再次运行该程序,它崩溃并抛出concurrentModificationException。 需要注意的是,我正在创建表user_to_user,如下所示:

private HashBasedTable<Double,Double,Integer> user_to_user;//
user_to_user = HashBasedTable.create();

更令人惊讶的是,当我交换我填充朋友的方式时,我的意思是这样:

Map<Double,Integer> friends = user_to_user.column(user);
friends.putAll(user_to_user.row(user));

然后每个人都会工作正常。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题是HashBasedTable在内部实现为Map<Double, Map<Double, Integer>>,并且user_to_user.column(user)的实现在您修改与之关联的行的同时迭代行user

一个可行的替代方案是将user_to_user.column(user)复制到单独的Map中,然后再将其放入行中。