什么时候一个类应该是 Comparable 和/或 Comparator?

我见过同时实现 可比的比较器的类。这是什么意思?我为什么要用一个而不是另一个?

223706 次浏览

下面的文本来自 比较器 VS 比较器

可比的

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

比较器

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

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

Comparator表示特定用途的排序本身。

实现 Comparable意味着“ 我可以把自己和另一件物品进行比较。”,当存在单个自然默认比较时,这通常很有用。

实现 Comparator意味着“ 我可以比较另外两件物品。”这在有多种方法比较一种类型的两个实例时非常有用——例如,你可以通过年龄、姓名等来比较人们。

通常首选 Comparable。但是有时候类已经实现了 Comparable,但是您希望在不同的属性上进行排序。那你就只能用 Comparator了。

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

Comparable是自然排序的对象。对象本身知道如何排序。
Comparator适用于没有自然顺序或希望使用不同顺序的对象。

类可以实现自己的比较:

  • 它在 同班同学(这通常是一个优势)
  • 可以有 只有一种实现(所以如果您想要两个不同的情况下,您不能使用它)

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

  • 它通常在一个唯一的实例中(在同一个类中或在另一个地方)
  • 命名每个实现的方式,你想要排序的东西
  • 你可以为 您不能控制的类提供比较器
  • 实现是 即使第一个对象为空,也可以使用

在这两种实现中,仍然可以使用 选择你想要被比较的东西。 使用泛型,您可以这样声明,并在编译时检查它。这提高了安全性,但是确定合适的值也是一个挑战。

作为一个指导原则,我通常使用该对象可以比较的最一般的类或接口,在我设想的所有用例中... 但是定义不是很精确!:-(

  • Comparable<Object>允许您在编译时在所有代码中使用它(如果需要,这样做是好的,如果不需要,则是坏的,这样您就失去了编译时错误) ; 您的实现必须处理对象,并根据需要以健壮的方式进行强制转换。
  • 相反,Comparable<Itself>是非常严格的。

有趣的是,当你将子类本身子类化为子类时,子类必须是可比的并且是健壮的(否则它会破坏 Liskov 原则,给你带来运行时错误)。

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

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

Comparator用于比较两种数据类型是否为对象。

以下是我在网上发现的几个比较器和可比性之间的区别:

  1. 如果您看到这两者之间的逻辑区别是,在 Java 中,将比较器比较提供给他的两个对象,而 Compaable 接口将“ this”引用与指定的对象进行比较。

  2. 在 Java 中,可比对象用于实现对象的自然排序。在 JavaAPI 字符串中,Date 和包装类实现了 Compaable 接口。

  3. 如果有类在 Java 中实现了 Compaable 接口,那么 List 或 Array 对象的集合可以通过 Collections.sort ()或 Array.sort ()方法自动排序,对象将根据 CompareTo 方法定义的自然顺序进行排序。

  4. 在 Java 中实现 Compaable 的对象可以用作排序映射中的键或例如 TreeSet 中的排序集中的元素,而不需要指定任何 Compaator。

Site: 如何在 Java 中使用比较器和比较器

阅读更多: 如何在 Java 中使用比较器和比较器? 举例说明

用于实现 Compable 和 Compaator 的注释库:

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);
}
}

单击链接查看更多示例

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

Java 中的 Comparable用于实现对象的自然排序。在 JavaAPI 字符串中,Date 和包装类实现 Comparable接口。

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

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

Lang 可比

  1. 要实现 Comparable接口,类必须实现单个方法 compareTo()

    int a.compareTo(b)

  2. 必须修改要对其实例进行排序的类。因此,每个类只能创建一个排序序列。

Java.util 比较器

  1. 要实现 Compator 接口,类必须实现单个方法 compare()

    int compare (a,b)

  2. 构建一个独立于要对其实例进行排序的类的类。因此,每个类可以创建多个排序序列。