Arrays.sort(Comparator)-Java 6与Java 7 import java.util.Comparator; 公共类比较器{ int i; 内部的公共静态类实现了Comparator{ @凌驾 公共整数比较(CompareTester o1、CompareTester o2){ //TODO自动生成的方法存根 系统输出打印LN(o1.i-o2.i); 返回0; }}} 公共类比较测试{ 公共静态void main(字符串[]args){ CompareTester j=新的CompareTester(); j、 i=3; CompareTester k=新的CompareTester(); k、 i=5; CompareTester l=新的CompareTester(); l、 i=7; CompareTester[]数字={j,k,l}; sort(numbers,newcompareTester.Inside()); }}

Arrays.sort(Comparator)-Java 6与Java 7 import java.util.Comparator; 公共类比较器{ int i; 内部的公共静态类实现了Comparator{ @凌驾 公共整数比较(CompareTester o1、CompareTester o2){ //TODO自动生成的方法存根 系统输出打印LN(o1.i-o2.i); 返回0; }}} 公共类比较测试{ 公共静态void main(字符串[]args){ CompareTester j=新的CompareTester(); j、 i=3; CompareTester k=新的CompareTester(); k、 i=5; CompareTester l=新的CompareTester(); l、 i=7; CompareTester[]数字={j,k,l}; sort(numbers,newcompareTester.Inside()); }},java,java-7,java-6,Java,Java 7,Java 6,当在Java6和Java7中运行时,这两个类在CompareTester类中给出了两个不同的结果 Java7中是否为Comparator引入了任何不同类型的实现?除了a(仅与内部相关)之外,Array.sort(E,Comparator)的最终结果之间没有差异。所以,不,并没有区别“在Java7中为Comparator引入” 只需将您的实现更改为 import java.util.Comparator; public class CompareTester { int i; public sta

当在Java6和Java7中运行时,这两个类在CompareTester类中给出了两个不同的结果

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

除了a(仅与内部相关)之外,Array.sort(E,Comparator)的最终结果之间没有差异。所以,不,并没有区别“在Java7中为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) {
        // 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());
}}
这样,您就不需要使用
数组进行任何特殊操作。排序

import java.lang.Comparable;
public class CompareTester implements Comparable<CompareTester> {
    int i;

    public int compareTo(CompareTester o) {
        return this.i - o.i;
    }
}

Java7使用TimSort,Java6使用MergeSort。您的比较器总是返回0,这会破坏该值,而TimSort正在对此进行拾取


要修复代码,您确实需要解决这个问题。如果您真的想使用旧的排序算法,那么使用
-Djava.util.Arrays.useLegacyMergeSort=true进行编译

比较
中返回0将意味着用于此目的的对象是相同的,因此顺序取决于算法是稳定的还是不稳定的。您的比较测试仪返回的结果都是相等的。这不是一个好主意,也不是一个好测试。为什么您的
比较器总是返回
0
?这里我只是在考虑为什么“CompareTester”类中的“compare”方法对Java 6和Java 7使用两个不同的参数(o1和o2)。感谢您的回答。这里不同的排序算法是不相关的,因为我只是使用整数。但在实际的应用程序代码中,我使用的是对象,我必须重写compare方法来比较这些对象。这导致了一个问题。如果您正在比较两个
对象
s,如
obj1==obj2
,请查看;您应该重写
.equals
.hashCode
。对于排序,然后实现
Compariable
接口是正确的方法。
import java.lang.Comparable;
public class CompareTester implements Comparable<CompareTester> {
    int i;

    public int compareTo(CompareTester o) {
        return this.i - o.i;
    }
}
Arrays.sort(numbers);