为什么compareTo无效导致Collections.sort崩溃?

wvd*_*vdz 4 java collections comparable

考虑以下compareTo方法,实现Comparable<T>接口:

@Override
public int compareTo(MyObject o)
{
    if (o.value.equals(value)
        return 0;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

显然,程序员将compareTo实现为equals().显然是个错误.我希望这会导致Collections.sort()崩溃,但事实并非如此.相反,它只会给出一个任意结果:排序结果取决于初始排序.

public class MyObject implements Comparable<MyObject>
{

    public static void main(String[] args)
    {
        List<MyObject> objects =
                Arrays.asList(new MyObject[] {
                        new MyObject(1), new MyObject(2), new MyObject(3)
                });
        Collections.sort(objects);
        System.out.println(objects);

        List<MyObject> objects2 =
                Arrays.asList(new MyObject[] {
                        new MyObject(3), new MyObject(1), new MyObject(2)
                });
        Collections.sort(objects2);
        System.out.println(objects2);
    }

    public int  value;

    public MyObject(int value)
    {
        this.value = value;
    }

    @Override
    public int compareTo(MyObject o)
    {
        if (value == o.value)
            return 0;
        return 1;
    }

    public String toString()
    {
        return "" + value;
    }

}
Run Code Online (Sandbox Code Playgroud)

结果:

[3, 2, 1]
[2, 1, 3]
Run Code Online (Sandbox Code Playgroud)

我们能否为compareTo的这种奇怪实现提出一个用例,或者它总是无效的.如果是后者,它应该抛出异常,还是甚至不能编译?

chi*_*ity 5

它没有理由崩溃或抛出异常.

在实现该方法时,您需要履行合同,但如果不这样做,则只意味着您将从依赖它的任何内容中获得任意结果.没有什么可以用来检查你的实现的正确性,因为这只会减慢一切.

排序算法的效率根据其进行的比较次数来定义.这意味着,它不会额外增加的比较只是为了检查你的代码是一致的,比那更HashMap会调用.hashcode()两次即可在一切检查的结果相同两次.

如果碰巧在排序过程中发现问题,那么它可能会抛出异常; 但不要依赖它.