Java:可比与比较器

Java:可比与比较器,java,comparator,comparable,Java,Comparator,Comparable,可能的重复项: 可比和比较的关键区别是什么 在什么情况下,哪一种方案比另一种方案更可取 谢谢 更新-与示例的良好链接 Comparator为您提供了一种为无法控制的类型提供自定义比较逻辑的方法 Comparable允许您指定要实现的对象的比较方式 显然,如果您对一个类没有控制权(或者您想提供多种方法来比较您可以控制的对象),那么就使用Comparator 否则,当类实现时,可以使用Comparable,类的compareTo方法定义该对象的“自然”顺序。该方法在合同上有义务(尽管不是必需的)

可能的重复项:

可比和比较的关键区别是什么

在什么情况下,哪一种方案比另一种方案更可取

谢谢

更新-与示例的良好链接


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

Comparable
允许您指定要实现的对象的比较方式

显然,如果您对一个类没有控制权(或者您想提供多种方法来比较您可以控制的对象),那么就使用
Comparator


否则,当类实现时,可以使用
Comparable
,类的
compareTo
方法定义该对象的“自然”顺序。该方法在合同上有义务(尽管不是必需的)与该对象上的其他方法保持一致,例如当
.equals()
比较返回true时,应始终为对象返回0

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

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


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

还有一个dup:。极好的示例链接。简单明了。请阅读。您更新的链接中充满了广告,甚至不能删除。你可以看看这个对源代码的控制是这里的关键字。@JonasGröger你说没有对类的控制是什么意思?@TheLogicGuy如果一个类来自依赖项或其他你不能/不允许更改的代码,你就没有对它的控制权。你不能将代码添加到你从中包含的类中外部图书馆。Comparable仅适用于您自己创建的类,因为您需要能够添加compareTo()方法。您无法控制
字符串
类,因为它已经由Java语言规范定义,因此对于
字符串
的任何自定义排序,我们需要使用
比较器
而不是
可比
。可比应该在对象内部实现。因此,使用compareTo方法为一个对象创建了一个依赖项,该依赖项将隐含到比较对象的特定类型的实现中。但是,comparator是外部化的,我们可以为同一个对象创建多种类型的comparator。我还需要更正我的理解。我遇到的一个例子是,您可能希望随机对任何字段进行有条件排序,在这种情况下,您可以动态传递Comparator以对类的集合进行排序,但如果您只是想在类中的另一个属性上定义唯一性,然后在类内部实现Comparable。它们不是相互排斥的。您可以使用“…implements Comparator”和“…implements Comparable”,在这种情况下有什么区别?也可以使用Comparable接口的“compareTo”方法来实现,但我认为这种方法不符合自然顺序。因此,我不能用Comparator做任何事情,但不能用compareTo实现,不是吗?