java7中的Collections.sort()问题

时间:2012-12-07 18:29:18

标签: sorting collections java-7

java7是否存在排序问题?我正在使用Collections.sort(列表,比较器)

当我切换到java7时,我注意到与使用java6时的结果相比,排序产生了不同的列表。

示例:List = [d,e,b,a,c,f,g,h]

在java6 Collections.sort(List,comparator)中产生[a,b,c,d,e,f,g,h]

在java7 Collections.sort(List,comparator)中产生[b,a,c,d,e,f,g,h]

列表中的前两个值已被交换。

2 个答案:

答案 0 :(得分:9)

Java 7从Merge sort切换到Tim sort。 “破坏的比较器”可能会导致顺序发生轻微变化(引用Arrays class源代码中的注释):

/**
 * Old merge sort implementation can be selected (for
 * compatibility with broken comparators) using a system property.
 * Cannot be a static boolean in the enclosing class due to
 * circular dependencies. To be removed in a future release.
 */

尝试使用以下命令运行JVM:

java -Djava.util.Arrays.useLegacyMergeSort=true

目前尚不清楚“损坏的比较器”是什么意思,但显然它可能导致排序数组中元素的顺序不同。

答案 1 :(得分:0)

有一点需要注意,这可能会引起混淆。 Collections.sort是一个稳定的排序。这意味着对于相同的元素,它保持其原始顺序,因此:

如果a == b,那么

Collections.sort([d, e, b, a, c, f, g, h]) = [b, a, c, d, e, f, g, h]

Collections.sort([d, e, a, b, c, f, g, h]) = [a, b, c, d, e, f, g, h]

在我看来,无论是您所看到的,还是有问题的比较器(或者对象的自然排序)都没有达到预期的效果。