为了防止其他人遇到类似的问题,我想我应该在这里发布我的问题和解决方案。
基本上,我的代码在 Java7 下运行良好,但在 Java8 中始终抛出 ConcurrentModificationException。结构基本上是这样的:
List<FormatData> formats = service.getFormat(type);
for (FormatData f : formats) {
/* Do stuff here */
}
但是,“在此处执行操作”部分最终调用相同的 service.getFormat(type)
函数并返回相同的列表。然而,同一个函数不仅查找列表,而且还对列表进行排序。在Java7中,由于列表已经排序,因此不会对其进行修改。在 Java8 中,它将对已排序列表的重新排序视为已修改。
最佳答案
我的解决方案有两个,其中任何一个都可以。 首先,我将排序从检索函数中移开,这样我就不会浪费时间 - 相反,我将它移到了加载函数中,它本来应该放在第一位。 其次,在一个返回相同列表但排序不同的较少使用的函数中,我刚刚创建了一个新列表,然后对其进行排序并返回:
result = new ArrayList(oldList);
Collections.sort(result, otherComparator);
此外,在返回任何一方之前,我添加了以下内容以确保在不引发异常的情况下不会发生更多修改:
result = (result==null) ? null : Collections.unmodifiableList(result);
关于java - 对已排序的列表进行排序时,列表迭代在 Java 8 中抛出 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28520268/