迭代列表(ConcurrentModificationException)

use*_*168 1 java iteration

以下代码抛出ConcurrentModificationException:

for (String word : choices) {
         List<String> choicesCopy = choices;
         chosen.add(word);
         choicesCopy.remove(word);
         subsets(choicesCopy, chosen, alreadyPrinted);
}
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?原始列表(选项)根本没有修改.

Man*_*noj 8

您在此处制作了参考副本而非对象副本

List<String> choicesCopy = choices;
Run Code Online (Sandbox Code Playgroud)

显然你正在修改相同的列表,你一定会得到 ConcurrentModificationException

使用Collections.copy()正确制作列表的副本.

编辑: 如下所示,您也可以使用构造函数进行复制.

  • 使用构造函数进行复制(例如``new ArrayList <String>(choices)`比使用`Collections.copy`更可取. (2认同)