对已排序的列表进行排序时,列表迭代在 Java 8 中抛出 ConcurrentModificationException
List iteration throws ConcurrentModificationException in Java 8 when sorting already sorted list
以防万一其他人有类似的问题,我想我会 post 我的问题和解决方案在这里。
基本上,我的代码在 Java7 下运行良好,但在 Java8 下一直抛出 ConcurrentModificationException。结构基本上是这样的:
List<FormatData> formats = service.getFormat(type);
for (FormatData f : formats) {
/* Do stuff here */
}
然而,"Do stuff here" 部分的一部分最终调用相同的 service.getFormat(type)
函数并返回相同的列表。然而,同一个函数查找了列表,但也对列表进行了排序。在Java7中,由于列表已经排序,所以没有修改它。在 Java8 中,它将对已排序列表的重新排序视为已修改。
我的解决方案是双重的,任何一个都行得通。
首先,我将排序从检索函数中移开,这样我就不会浪费时间——而是将它移到加载函数中,它应该放在第一位。
其次,在一个返回相同列表但排序不同的较少使用的函数中,我刚刚创建了一个新列表,然后对其进行排序并返回:
result = new ArrayList(oldList);
Collections.sort(result, otherComparator);
此外,在任何一方返回之前,我添加了这个以确保在不抛出异常的情况下不会发生更多修改:
result = (result==null) ? null : Collections.unmodifiableList(result);
以防万一其他人有类似的问题,我想我会 post 我的问题和解决方案在这里。
基本上,我的代码在 Java7 下运行良好,但在 Java8 下一直抛出 ConcurrentModificationException。结构基本上是这样的:
List<FormatData> formats = service.getFormat(type);
for (FormatData f : formats) {
/* Do stuff here */
}
然而,"Do stuff here" 部分的一部分最终调用相同的 service.getFormat(type)
函数并返回相同的列表。然而,同一个函数查找了列表,但也对列表进行了排序。在Java7中,由于列表已经排序,所以没有修改它。在 Java8 中,它将对已排序列表的重新排序视为已修改。
我的解决方案是双重的,任何一个都行得通。 首先,我将排序从检索函数中移开,这样我就不会浪费时间——而是将它移到加载函数中,它应该放在第一位。 其次,在一个返回相同列表但排序不同的较少使用的函数中,我刚刚创建了一个新列表,然后对其进行排序并返回:
result = new ArrayList(oldList);
Collections.sort(result, otherComparator);
此外,在任何一方返回之前,我添加了这个以确保在不抛出异常的情况下不会发生更多修改:
result = (result==null) ? null : Collections.unmodifiableList(result);