【发布时间】:2020-01-29 14:48:19
【问题描述】:
我一直在尝试获取列表的sub list,将其反转,然后将reversed 列表放回起始位置。例如,假设我们有列表[1, 2, 3, 4, 5, 6],然后从索引 2 反转到索引 4 将得到[1, 2, 5, 4, 3, 6]。
我为此编写了一些代码,但是它每次都会给出ConcurrentModificationException(除非 startIndex == endIndex)。下面提供了一个最小的可重现示例:
int startIndex = 2;
int endIndex = 4;
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
List<Integer> toReverse = list.subList(startIndex, endIndex+1);
Collections.reverse(toReverse);
list.removeAll(toReverse);
list.addAll(startIndex, toReverse);
线程“主”java.util.ConcurrentModificationException 中的异常
在 java.util.ArrayList$SubList.checkForComodification(未知来源)
在 java.util.ArrayList$SubList.size(Unknown Source) at
java.util.AbstractCollection.toArray(Unknown Source) at
java.util.ArrayList.addAll(Unknown Source) at
test.ConcurrentExample.main(ConcurrentExample.java:64)
错误所指的实际行是list.addAll(startIndex, toReverse);。
我不确定问题出在哪里,因为在迭代时似乎没有任何变化。如果有人能解释为什么会发生这种情况和/或如何解决它,我们将不胜感激。
【问题讨论】:
-
@pvpkiran 我不认为这是我的问题。我没有明确使用任何迭代器(尽管我确信
reverse隐含地使用一个来反转顺序)。所做的任何更改都发生在每个步骤结束之后(如在迭代中,而不是在迭代期间) -
错误是一致的,因为这一行:- list.removeAll(toReverse); .在调试器中查看 reverse 的值
-
您是否知道
subList会将view 返回到原始列表中?当你做Collections.reverse(toReverse);时,你已经修改了原来的列表;随后的list.removeAll(toReverse); list.addAll(startIndex, toReverse);完全过时了。
标签: java arraylist collections concurrentmodification