了解并发修改异常

时间:2015-02-02 23:52:39

标签: java

为什么我有ConcurrentModificationException?我正在迭代一个集合的对象并在另一个集合中删除它们:

  public static void printSubsets(Set<String> set){
    if (set.isEmpty()) return;
    printSet(set);

    Set<String> copy = set;
    for (String s: set){
      copy.remove(s);
      printSubsets(copy);
      copy.add(s);
   }
  }

1 个答案:

答案 0 :(得分:1)

不,您要从同一Set删除它们,因为此处只有一个Set对象。您有2个变量引用相同的Setsetcopy

set -----> Set object
copy ------^

通过任一变量都可以看到您所做的任何更改。您正在使用增强的for循环迭代Set中的元素,因此ConcurrentModificationException会产生结果。

为了防止这种情况,你可以制作一套(浅)副本。

Set<String> copy = new HashSet<String>(set);