gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:04 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com