什么时候应该是一个类比较和/或比较?

我看到了实现ComparableComparator的类 。 这是什么意思? 为什么我会用另一个呢?

下面的文本来自Comparator vs Comparable

可比

一个可比较的对象是能够比较自己与另一个对象。 类本身必须实现java.lang.Comparable接口,以便能够比较它的实例。

比较

比较器对象能够比较两个不同的对象。 这个类不是比较它的实例,而是一些其他类的实例。 这个比较器类必须实现java.util.Comparator接口。

实现“ Comparable意味着“我可以将自己与另一个对象进行比较”。 当有一个自然的默认比较时,这通常很有用。

Comparator实现意味着“我可以比较另外两个对象”。 当比较两个types的实例有多种方法时,这通常是有用的 – 例如,可以按年龄,名称等比较人们。

Comparable让一个类实现自己的比较:

  • 它在同一个class上 (这往往是一个优势)
  • 只能有一个实现 (所以如果你想要两个不同的情况,你不能使用它)

相比之下,比较器是一个外部比较:

  • 它通常是在一个独特的实例(无论是在同一个class级或在另一个地方)
  • 你用你想要分类的东西来命名每个实现
  • 你可以提供你不能控制的类的比较器
  • 即使第一个对象为null ,实现也是可用的

在这两种实现中,你仍然可以select你想要比较的东西 。 有了generics,你可以声明,并在编译时检查。 这提高了安全性,但确定适当的价值也是一个挑战。

作为一个指导原则,我通常使用最常用的类或接口,可以比较所有的用例,在我设想的所有用例…不是非常精确的定义! 🙁

  • Comparable<Object>可以让你在编译时在所有的代码中使用它(如果需要的话,这是很好的,或者不好的,并且你可以避免编译时错误)。 你的实现必须处理对象,并按照需要进行强制转换。
  • Comparable<Itself>是非常严格的。

有趣的是,当你把它自己子类化到子类时,子类也必须是可比较的,并且对它很有帮助(否则会打破Liskov原理,并给你运行时错误)。

Comparable是用于提供数据对象的默认sorting,例如,如果数据对象具有自然顺序。

Comparator代表特定用途的sorting。

java.lang.Comparable的

  1. 为了实现comparable接口,类必须实现一个方法compareTo()

    int a.compareTo(b)

  2. 您必须修改要对其实例进行sorting的类。 所以每个类只能创build一个sorting顺序。

的java.util.Comparator

  1. 为了实现比较器接口,类必须实现一个方法compare()

    int compare (a,b)

  2. 您可以创build一个与要sorting的实例分开的类。 这样可以为每个类创build多个sorting顺序。

通常Comparable喜欢Comparable 。 但是有时候一个类已经实现了Comparable ,但是你想对不同的属性进行sorting。 那么你不得不使用Comparator

有些类实际上为常见情况提供Comparators器; 例如, String s在sorting时默认是区分大小写的,但也有一个名为CASE_INSENSITIVE_ORDER的静态Comparator

这里是比较和我在网上find的可比数据之间的几个区别:

  1. 如果你看到这两者之间的逻辑差别,那么Java中的Comparator比较提供给他的两个对象,而Comparable接口将“this”引用与指定的对象进行比较。

  2. 在Java中可比较用于实现对象的自然sorting。 在Java API String中,Date和包装器类实现了Comparable接口。

  3. 如果任何类在Java中实现了Comparable接口,则可以使用Collections.sort()或Array.sort()方法自动对该对象的List或Array进行sorting,并且将根据CompareTo方法定义的自然顺序对对象进行sorting。

  4. 在Java中实现Comparable的对象可用作sorting映射中的键或sorting集中的元素(例如TreeSet),而不指定任何Comparator。

网站:如何在Java中使用Comparator和Comparable? 用例子

阅读更多: 如何在Java中使用Comparator和Comparable? 用例子

Comparable是具有自然sorting的对象。 对象本身知道如何命令。
Comparator是用于没有自然顺序的对象,或者当您希望使用不同的顺序。

比较器和可比较接口之间的区别

Comparable用于与另一个对象进行比较。

Comparator器用于比较两个数据types是对象。

如果你看到这两者之间的逻辑差别,那么Java中的Comparator比较提供给他的两个对象,而Comparable接口将“this”引用与指定的对象进行比较。

在Java中可Comparable用于实现对象的自然sorting。 在Java API String中,Date和包装器类实现了Comparable接口。

如果任何类在Java中实现了Comparable接口,则可以使用Collections.sort()Array.sort()方法自动对该对象的ListArray进行sorting,并且将根据compareTo方法定义的自然顺序对对象进行sorting。

在Java中实现Comparable对象可用作sorting映射中的键或sorting集中的元素(例如TreeSet ,而不指定任何Comparator

用于实现Comparable和Comparator的注释库:

 public class Person implements Comparable<Person> { private String firstName; private String lastName; private int age; private char gentle; @Override @CompaProperties({ @CompaProperty(property = "lastName"), @CompaProperty(property = "age", order = Order.DSC) }) public int compareTo(Person person) { return Compamatic.doComparasion(this, person); } } 

点击链接查看更多示例。 compamatic