【问题标题】:Java : Comparable vs Comparator [duplicate]Java:可比与比较器[重复]
【发布时间】:2011-05-05 17:58:08
【问题描述】:

可能的重复:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?

Comparable 和 Comparator 之间的主要区别是什么。

在什么情况下哪个比另一个更受欢迎?

谢谢

已更新 - 与示例的良好链接!!

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

【问题讨论】:

标签: java comparator comparable


【解决方案1】:

当您的类实现Comparable 时,该类的compareTo 方法定义了该对象的“自然”顺序。该方法有合同义务(尽管不是强制要求)与该对象上的其他方法保持一致,例如当 .equals() 比较返回 true 时,应始终为对象返回 0。

Comparator 是它自己对如何比较两个对象的定义,可用于以可能不符合自然顺序的方式比较对象。

例如,字符串通常按字母顺序进行比较。因此"a".compareTo("b") 将使用字母比较。如果你想比较字符串的长度,你需要编写一个自定义比较器。

简而言之,没有太大区别。它们都是类似手段的目的。通常为自然顺序实现可比较,(自然顺序定义显然可以解释),并为其他排序或比较需求编写比较器。

【讨论】:

  • Comparable 应该在对象内部实现。因此,使用 compareTo 方法为对象创建了一个依赖关系,这将隐含在比较对象的特定类型的实现中。但是,比较器是外部化的,我们可以为同一个对象拥有多种类型的比较器。也需要更正我的理解。
  • 我遇到的一种情况是,您可能希望有条件地随机对任何字段进行排序,在这种情况下,您可以动态传递 Comparator 以便对类的集合进行排序,但是如果您只是想在类中的另一个属性上定义唯一性,然后在类中实现 Comparable。它们并不相互排斥。
  • 可以使用“...implements Comparator”,也可以使用“..implements Comparable”,这种情况有什么区别?
  • 也可以以我强加为非自然顺序的方式实现 Comparable 接口的 'compareTo' 方法。因此,我可以用 Compartor 做任何事情,但不能用 compareTo 实现,不是吗?
【解决方案2】:

Comparator 为您提供了一种为您无法控制的类型提供自定义比较逻辑的方法。

Comparable 允许您指定如何比较您正在实现的对象。

显然,如果您无法控制某个类(或者您想提供多种方法来比较您可以控制的对象),请使用Comparator

否则你可以使用Comparable

【讨论】:

  • 控制源是这里的关键词。
  • @JonasGröger 无法控制类是什么意思?
  • @TheLogicGuy 如果某个类来自依赖项或其他您不能/不允许更改的代码,则您无法控制该类。
  • 您不能将代码添加到您从外部库中包含的类中。 Comparable 仅适用于您自己创建的类,因为您需要能够在类主体中添加 compareTo() 方法。
  • 您无法控制 String 类,因为它已由 Java 语言规范定义,因此对于 String 上的任何自定义排序,我们需要使用 Comparator 而不是Comparable.
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多