java - Java 8 中的 Collections.sort 在比较器返回 0 时不能像 Java 6 那样工作

标签 java sorting collections java-8 comparator

最近我将我们的应用程序 jdk 从 Java 6 更新到 Java 8,但源语言级别仍然保持为 Java 6。更改后,我们的一个单元测试失败了。 我注意到 LinkedList 的 Collections.sort 在 Java 8 和 Java 6 中的工作方式不同。即使我是使用 JDk 1.8 的源代码级 java 8,我也会得到相同的不同行为。 重现问题: 定义下面的枚举:

public enum Weight {
    A(1), B(0), C(0), D(0), E(2);

    public int getWeight() {
        return weight;
    }

    private int weight;

    Weight(int weight) {

        this.weight = weight;
    }

    @Override
    public String toString() {
       return  name() + '(' + weight + ')';
    }
}

和一个主类如下:

public class Main {

    public static void main(String[] args) {
      List<Weight> weightList = new LinkedList<Weight>();
      weightList.add(Weight.A);
      weightList.add(Weight.B);
      weightList.add(Weight.C);
      weightList.add(Weight.D);
      weightList.add(Weight.E);

        Collections.sort(weightList, new Comparator<Weight>() {
            @Override
            public int compare(Weight o1, Weight o2) {
                return o1.getWeight() > o2.getWeight()? 1:0;
            }
        });

        System.out.print(weightList);

    }
}

在 Java 6 下运行代码的输出是: "C:\Program Files\Java\jdk1.6.0_45\bin\java"

[B(0), C(0), D(0), A(1), E(2)]

在 java 8 下运行代码的输出是:

“C:\Program Files (x86)\Java\jdk1.8.0_161\bin\java”

[A(1), B(0), C(0), D(0), E(2)]

我将类型从 LinkedList 更改为 ArrayList 并且我得到了相同的结果但是如果我如下更改比较器那么 Java 8 将对数组进行排序:

Collections.sort(weightList, new Comparator<Weight>() {
            @Override
            public int compare(Weight o1, Weight o2) {
                return o1.getWeight() > o2.getWeight()? 1:-1;
            }
        });

如您所见,java 8 似乎没有正确排序代码。 Java 中是否存在错误,或者我像往常一样遗漏了什么?

最佳答案

内部排序算法was changed to Tim Sort for objects and a dual-pivot quicksort for primitives从 JDK 7 开始。

由于您的比较器是错误的(对于不相等的值它返回 0),您很幸运它之前没有中断。现在它按预期中断了。

关于java - Java 8 中的 Collections.sort 在比较器返回 0 时不能像 Java 6 那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071051/

相关文章:

java - 不带库方法的二分查找

c# - 如何在 C# 中验证值的集合是唯一的(不包含重复项)

java - 让另一个类在 actionListener 中工作

java - 是否可以捕获 java.lang.reflect.GenericSignatureFormatError?

java - 根据 XMLGregorianCalendar 类型的键对 map 进行排序

ios - NSPredicate SELF CONTAINS[c] 首先返回较长文本中包含的值

collections - 如何检查对象是否为集合

java - 从另一个对象列表创建对象元素的列表

java - 如何让线程等待任务完成?

Java 线程 : Specifying what should be executed in the run function