我在单元测试中遇到了这个问题。
执行后:
List<Card> cleanCards = cards.subList(0, cards.size() - difference);下面的断言给了我一个ConcurrentModificationException:
assertEquals(limit, cleanCards.size());错误描述
java.util.ConcurrentModificationException
at java.util.ArrayList$SubList.size(ArrayList.java:1057)据我所知,'size()‘方法不会对列表进行结构更改。我是不是漏掉了什么?
发布于 2017-12-19 16:25:23
最有可能的是,原始列表是在子列表创建和使用之间进行修改的。subList不创建独立的新列表,而是创建原始列表的一个部分的视图,就像规格所说的
如果支持列表(即此列表)在结构上被修改,而不是通过返回的列表,则此方法返回的列表的语义将变得不明确。(结构修改是那些改变列表大小的修改,或者以其他方式干扰它,以致正在进行的迭代可能产生不正确的结果。)
在您的例子中,“未定义的”行为似乎会导致抛出一个异常,也就是所谓的快速失败行为。我认为一个简单的解决方案是将上面的第一行改为
List<Card> cleanCards = new ArrayList<>(cards.subList(0, cards.size() - difference));它将子列表复制到一个与原始列表无关的全新列表中。
https://stackoverflow.com/questions/47890998
复制相似问题