Java List和递归导致并发修改异常

Ant*_*hea 3 java recursion list concurrentmodification

以下函数以递归方式遍历列表并将其除以一半,并对子列表执行某些操作.如果列表大小为2,则递归会中断.我知道如果在迭代它时更改列表,则会发生并发修改异常.但我不使用迭代,它仍然会发生:

    private static List<ParticipantSlot> divide(List<ParticipantSlot> list) {
        int n = list.size();

        //do something 

        if (n>2){
            List<ParticipantSlot> l = divide(list.subList(0, n/2-1));
            List<ParticipantSlot> r= divide(list.subList(n/2, n));

            l.addAll(r);
            return l;
        }else{
            return list;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

您正在使用addAll()哪个将迭代您在参数中提供的集合.现在subList只将视图返回到原始列表,因此您尝试将值添加到原始列表的视图中,并同时迭代原始列表的不同部分.砰.

如果你每次创建一个子列表的副本,它应该工作 - 虽然它效率很低.