我见过同时实现 可比的和 比较器的类。这是什么意思?我为什么要用一个而不是另一个?
下面的文本来自 比较器 VS 比较器
可比的
一个可比对象能够将自己与另一个对象进行比较。类本身必须实现 java.lang.Comparable接口,以便能够比较其实例。
java.lang.Comparable
比较器
比较器对象能够比较两个不同的对象。该类不比较其实例,而是比较其他类的实例。这个比较器类必须实现 java.util.Comparator接口。
java.util.Comparator
Comparable用于提供数据对象的默认顺序,例如,如果数据对象具有自然顺序。
Comparable
Comparator表示特定用途的排序本身。
Comparator
实现 Comparable意味着“ 我可以把自己和另一件物品进行比较。”,当存在单个自然默认比较时,这通常很有用。
实现 Comparator意味着“ 我可以比较另外两件物品。”这在有多种方法比较一种类型的两个实例时非常有用——例如,你可以通过年龄、姓名等来比较人们。
通常首选 Comparable。但是有时候类已经实现了 Comparable,但是您希望在不同的属性上进行排序。那你就只能用 Comparator了。
有些类实际上为常见情况提供了 Comparators; 例如,在默认情况下,String在排序时是区分大小写的,但是还有一个名为 CASE_INSENSITIVE_ORDER的静态 Comparator。
Comparators
String
CASE_INSENSITIVE_ORDER
Comparable是自然排序的对象。对象本身知道如何排序。 Comparator适用于没有自然顺序或希望使用不同顺序的对象。
类可以实现自己的比较:
相比之下,比较器是一种外部比较:
在这两种实现中,仍然可以使用 选择你想要被比较的东西。 使用泛型,您可以这样声明,并在编译时检查它。这提高了安全性,但是确定合适的值也是一个挑战。
作为一个指导原则,我通常使用该对象可以比较的最一般的类或接口,在我设想的所有用例中... 但是定义不是很精确!:-(
Comparable<Object>
Comparable<Itself>
有趣的是,当你将子类本身子类化为子类时,子类必须是可比的并且是健壮的(否则它会破坏 Liskov 原则,给你带来运行时错误)。
比较器和可比较接口之间的区别
Comparable用于与另一个对象进行比较。
Comparator用于比较两种数据类型是否为对象。
以下是我在网上发现的几个比较器和可比性之间的区别:
如果您看到这两者之间的逻辑区别是,在 Java 中,将比较器比较提供给他的两个对象,而 Compaable 接口将“ this”引用与指定的对象进行比较。
在 Java 中,可比对象用于实现对象的自然排序。在 JavaAPI 字符串中,Date 和包装类实现了 Compaable 接口。
如果有类在 Java 中实现了 Compaable 接口,那么 List 或 Array 对象的集合可以通过 Collections.sort ()或 Array.sort ()方法自动排序,对象将根据 CompareTo 方法定义的自然顺序进行排序。
在 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接口,那么该对象的集合 List或 Array可以通过使用 Collections.sort()或 Array.sort()方法进行自动排序,对象将根据 compareTo方法定义的自然顺序进行排序。
List
Array
Collections.sort()
Array.sort()
compareTo
在 Java 中实现 Comparable的对象可以用作排序映射中的键或排序集中的元素(例如 TreeSet) ,而不需要指定任何 Comparator。
TreeSet
Lang 可比
要实现 Comparable接口,类必须实现单个方法 compareTo()
compareTo()
int a.compareTo(b)
必须修改要对其实例进行排序的类。因此,每个类只能创建一个排序序列。
Java.util 比较器
要实现 Compator 接口,类必须实现单个方法 compare()
compare()
int compare (a,b)