最近我将我们的应用程序 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/