java - 为什么无效的 compareTo 不会导致 Collections.sort 崩溃?

标签 java collections comparable

考虑以下 compareTo 方法,实现 Comparable<T>界面:

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

显然,程序员将 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;
    }

}

结果:

[3, 2, 1]
[2, 1, 3]

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

最佳答案

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

当您实现该方法时,您需要履行契约(Contract),但如果您不这样做,就意味着您将从任何依赖它的事物中获得任意结果。没有什么会特意去检查你的实现的正确性,因为那只会减慢一切。

排序算法的效率是根据它进行的比较次数来定义的。这意味着它不会添加额外的比较来检查您的实现是否一致,就像 HashMap 将对所有内容调用 .hashcode() 两次一样只是为了检查它两次给出相同的结果。

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

关于java - 为什么无效的 compareTo 不会导致 Collections.sort 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26504803/

相关文章:

java - ClassNotFoundException : org. Glassfish . Jersey .servlet.ServletContainer

sorting - 集合排序自定义比较器

c# - 如何将实现公共(public)接口(interface)的集合添加在一起

java - 使用 <Item extends java.lang.Comparable<Item>> 时绑定(bind)不匹配

java - 替换匹配的正则表达式的子字符串

java - Android 中的 TextView.setText

java - 如何检查数组中是否有重复的数字?

java - 找不到符号 - 方法错误

java - 接口(interface)和同类产品

java - Java 日历的序列化