我知道有很多主题相同的主题,但在我看来,这个案例有点不同,并且在 javadocs 中没有详细记录。这是代码:
Random random = new Random(0);
var list = new ArrayList<>();
for (int i = 0; i < 60; i++) {
list.add(random.nextInt());
}
list.sort((x, y) -> {
int sum = list.stream().reduce(0, Integer::sum);
System.out.println(sum);
return Integer.compare(x + sum, y + sum);
});
结果是异常:
-1303811196
-1303811196
.....
-1303811196
-1303811196
-1303811196
-1364558868
-1569607140
-1836181454
-2014724660
-2023409163
-2094470032
-2128134715
2107317277
2107317277
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.base/java.util.TimSort.mergeLo(TimSort.java:781)
at java.base/java.util.TimSort.mergeAt(TimSort.java:518)
at java.base/java.util.TimSort.mergeCollapse(TimSort.java:448)
at java.base/java.util.TimSort.sort(TimSort.java:245)
at java.base/java.util.Arrays.sort(Arrays.java:1516)
at java.base/java.util.ArrayList.sort(ArrayList.java:1717)
at HomeWork6_4.Company.main(Company.java:131)
所以看起来,在排序过程中不可能依赖收集,因为它处于脏状态。这种行为是否记录在某处?