2010-11-05 145 views
112

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

什么是可比的,比较之间的差异键。

在哪些情况下,哪个优于其他?

感谢

更新 - 以实例很好的链接!

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

+2

http://grdurand.com/static/presentation_four/comparable.html – 2010-11-05 17:52:49

+1

另外一个副本:[何时使用Comparable and Comparator](http://stackoverflow.com/q/2266827/642706)。 – 2015-07-06 02:27:12

+0

优秀的示例链接。简单明了。请阅读。 – Androidster 2016-10-10 19:45:55

回答

158

当你的班级实施Comparable时,该班级的compareTo方法正在定义该对象的“自然”排序。该方法在合同中有义务(尽管不是要求)与该对象上的其他方法一致,例如当.equals()比较返回true时,总是应该返回0。

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

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

总之,没有太大的区别。它们都以类似的方式结束。一般来说,自然顺序的实现是可比较的(自然顺序定义显然是可以解释的),并为其他排序或比较需求编写一个比较器。

+8

对象应该在对象内部实现。所以有一个用compareTo方法创建的对象的依赖关系,这将隐含在比较对象的特定类型实现中。但是,比较器是外部化的,我们可以为同一个对象提供多种类型的比较器。还需要更正我的理解。 – Sridhar 2016-04-21 02:52:43

+0

我遇到过的一个案例是,您可能想随意对任何字段进行条件排序,在这种情况下,您可以动态地传递Comparator以对类的集合进行排序,但是如果您只是想在另一个字段上定义唯一性属性,然后在课堂中实现Comparable。它们不是相互排斥的。 – markg 2017-11-17 14:14:37

106

Comparator为您提供了对你有没有控制权类型提供定制的比较逻辑的一种方式。

Comparable允许您指定您正在实施的对象如何进行比较。显然,如果你不能控制一个类(或者你想提供多种方法来比较你可以控制的对象),那么就使用Comparator。您可以使用Comparable

+30

**对源**的控制是这里的关键字。 – 2015-07-18 18:21:06

+0

@JonasGröger对于一个班级没有控制权意味着什么? – TheLogicGuy 2016-12-22 18:27:56

+0

@TheLogicGuy如果某个类来自依赖项或其他您不能更改的代码,则您无法控制该类。 – 2016-12-22 18:55:08