考虑以下 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/