Arrays.sort(Comparator) - Java 6 vs Java 7

时间:2014-07-11 14:48:51

标签: java java-7 java-6

import java.util.Comparator;
public class CompareTester {
int i;
public static class Inside implements Comparator<CompareTester> {
    @Override
    public int compare(CompareTester o1, CompareTester o2) {
        // TODO Auto-generated method stub
        System.out.println(o1.i - o2.i);
        return 0;
}}}

public class CompareTest {
public static void main(String[] args) {
    CompareTester j = new CompareTester();
    j.i = 3;
    CompareTester k = new CompareTester();
    k.i = 5;
    CompareTester l = new CompareTester();
    l.i = 7;
    CompareTester[] numbers = { j, k, l };
    Arrays.sort(numbers, new CompareTester.Inside());
}}

在Java 6和Java 7中运行时,这两个类在CompareTester类中提供两个不同的结果。

Java7 for Comparator中是否引入了任何不同类型的实现?

2 个答案:

答案 0 :(得分:4)

Java 7使用TimSort,Java 6使用MergeSort。你的比较器总是返回0,这会打破Comparable Contract并且TimSort正在接受它。

要修复您真正需要解决的代码。如果您确实想使用旧的排序算法,请使用-Djava.util.Arrays.useLegacyMergeSort=true

进行编译

答案 1 :(得分:3)

different sorting algorithm之外,Array.sort(E, Comparator)仅在内部相关,import java.util.Comparator; public class CompareTester { int i; public static class Inside implements Comparator<CompareTester> { @Override public int compare(CompareTester o1, CompareTester o2) { return o1.i - o2.i; } } } 的最终结果之间没有区别。所以,不,“Java7 for Comparator”中没有引入差异。

只需将您的实施更改为

即可
Comparator

并且比较最终得到的数组,你会发现Java 6和7之间没有区别。

修改

如果您想避免使用CompareTester,请改为使用import java.lang.Comparable; public class CompareTester implements Comparable<CompareTester> { int i; public int compareTo(CompareTester o) { return this.i - o.i; } } 类实现Comparable<T>(Java 7 doc here);

Array.sort

然后,Arrays.sort(numbers);

你不需要任何特别的东西
{{1}}