compare() 和 compareTo() 之间有什么区别?

2022-08-31 08:56:42

Java和方法有什么区别?这些方法给出了相同的答案吗?compare()compareTo()


答案 1

来自 JavaNotes

  • a.compareTo(b)
    可比较接口 :比较值并返回一个 int,该 int 指示值的比较值是小于、等于还是大于。
    如果类对象具有自然顺序,请实现接口并定义此方法。所有具有自然排序实现的 Java 类 - 例如:、包装类Comparable<T>Comparable<T>StringBigInteger

  • compare(a, b)
    比较器接口:比较两个对象的值。这是作为接口的一部分实现的,典型的用途是定义一个或多个实现此目的的小型实用程序类,以传递给sort()等方法或通过对数据结构(如TreeMapTreeSet)进行排序来使用。您可能希望为以下各项创建比较器对象:Comparator<T>

    • 多重比较。提供几种不同的方法来对某些内容进行排序。例如,您可能希望按姓名、ID、年龄、身高等对 Person 类进行排序。您可以为每个要传递给方法的比较器定义一个比较器。sort()
    • 系统类为您无法控制的类提供比较方法。例如,您可以为字符串定义一个比较器,该比较器按长度比较字符串。
    • 策略模式实现 Strategy 模式,这是一种您希望将算法表示为对象的情况,您可以将其作为参数传递,保存在数据结构中等。

如果您的类对象具有一个自然排序顺序,则可能不需要 compare()。


http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html 总结


比较 可比较的对象能够将自身与另一个对象进行比较。

比较器
比较器对象能够比较两个不同的对象。该类不是在比较其实例,而是在比较其他类的实例。


用例上下文:

可比接口

equals 方法和 and 运算符测试相等/不等式,但不提供测试相对值的方法
一些类(例如,String和其他具有自然排序的类)实现接口,它定义了一个方法。
如果要将它与 或 方法一起使用,则需要在类中实现。==!=Comparable<T>compareTo()Comparable<T>Collections.sort()Arrays.sort()

定义比较器对象

您可以创建比较器,以任意方式对任何类进行排序
例如,该类定义比较器CASE_INSENSITIVE_ORDERString


这两种方法之间的差异可以链接到:
有序集合的概念:

对集合进行排序时,这意味着您可以按特定(非随机)顺序(a 未排序)循环访问集合。Hashtable

具有自然顺序的集合不仅有序,而且排序。定义自然顺序可能很困难!(如自然字符串顺序)。


另一个区别,HaveAGuess评论中指出:

  • Comparable在实现中,从界面中不可见,因此当您进行排序时,您并不真正知道会发生什么。
  • Comparator让您放心,订购将得到很好的定义。

答案 2

compareTo() 来自可比较接口。

compare() 来自比较器接口。

这两种方法都执行相同的操作,但每个接口在略有不同的上下文中使用。

可比较接口用于对实现类的对象施加自然排序。该方法称为自然比较方法。比较器接口用于对实现类的对象施加总排序。有关详细信息,请参阅有关何时使用每个接口的链接。compareTo()


推荐