java - 对已排序的列表进行排序时,列表迭代在 Java 8 中抛出 ConcurrentModificationException

标签 java list sorting iteration concurrentmodification

为了防止其他人遇到类似的问题,我想我应该在这里发布我的问题和解决方案。

基本上,我的代码在 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/

相关文章:

python - 从列表写入 CSV,write.row 似乎停在了一个奇怪的地方

php - 检查数组元素是否对称

javascript - 按嵌套属性对字典的键进行排序

java - 将所有方法设为静态

java - 非方形物体的碰撞检测

java - 从 eclipse 迁移到 vim 有什么好的教程吗?

python - 列表中的项目数按降序排列

java - 使用 java 8 流基于另一个 List<Object2> 填充 List<Object1>

sql-server - 避免 SQL Server GROUP BY 中不必要的排序?

java - 我必须按什么顺序编码?