我看到了同时实现Comparable和Comparator的类。这是什么意思?为什么我要使用一个?
我看到了同时实现Comparable和Comparator的类。这是什么意思?为什么我要使用一个?
Answers:
下面的文字来自Comparator vs Comparable
可比
可比较的对象能够将自身与另一个对象进行比较。类本身必须实现java.lang.Comparable
接口,以便能够比较其实例。
比较器
比较器对象能够比较两个不同的对象。该类不是在比较其实例,而是在比较其他一些类的实例。此比较器类必须实现java.util.Comparator
接口。
实现的Comparable
意思是“ 我可以将自己与另一个对象进行比较。 ”当存在单个自然默认比较时,这通常很有用。
实现的Comparator
意思是“ 我可以比较两个其他对象。 ”当有多种方式比较一个类型的两个实例时,这通常很有用-例如,您可以按年龄,姓名等比较人员。
Person
实现Comparable
的,因为你不能再改怎么两个人进行比较。
Person
。2)比较器,例如PersonAgeComparator
,它能够比较两个不同的实体,并确定哪个应该以特定的排序顺序排在第一位。3)排序代码,它接受实体和比较器的集合,并使用比较器对集合进行排序以确定顺序。
Comparable让类实现自己的比较:
相比之下,比较器是一个外部比较:
在这两种实现中,您仍然可以选择要比较的内容。使用泛型,您可以声明为如此,并在编译时进行检查。这样可以提高安全性,但是确定合适的值也是一个挑战。
作为指导,在我设想的所有用例中,我通常使用可以与该对象进行比较的最通用的类或接口。:-(
Comparable<Object>
使您可以在编译时在所有代码中使用它(如果需要,则很好,如果不需要,则不好,并且您松开了编译时错误);您的实现必须处理对象,并按需要但以可靠的方式进行转换。Comparable<Itself>
相反,它非常严格。有趣的是,当您将其自身子类化为子类时,子类还必须具有可比性并且对此具有鲁棒性(否则,它将破坏Liskov原理,并给您带来运行时错误)。
Comparable
通常是首选。但是有时候一个类已经实现了Comparable
,但是您想对另一个属性进行排序。然后,您不得不使用Comparator
。
一些类实际上提供Comparators
了常见的情况。例如,String
默认情况下,s在排序时区分大小写,但也有一个Comparator
称为的静态变量CASE_INSENSITIVE_ORDER
。
以下是我在网上发现的Comparator和Comparable之间的一些区别:
如果您看到然后这两者之间的逻辑差异是Java中的Comparator比较提供给他的两个对象,而Comparable接口则将“ this”引用与指定的对象进行比较。
Java中的Comparable用于实现对象的自然排序。在Java API String中,Date和wrapper类实现Comparable接口。
如果任何类在Java中实现Comparable接口,则可以使用Collections.sort()或Array.sort()方法自动对List或Array的对象集合进行排序,并且对象将根据CompareTo方法定义的自然顺序进行排序。
可以在Java中实现Comparable的对象用作排序映射中的键或排序集中的元素(例如TreeSet),而无需指定任何Comparator。
站点:如何在Java中使用Comparator和Comparable?带例子
Comparable
用于具有自然顺序的对象。对象本身知道如何排序。
Comparator
用于没有自然顺序的对象,或者您希望使用其他顺序的对象。
比较器和可比较接口之间的区别
Comparable
用于与另一个对象进行比较。
Comparator
用于比较两个数据类型是对象。
如果您看到了,那么这两者之间的逻辑差异就是Comparator
在Java中比较提供给他的两个对象,而Comparable
接口将“ this”引用与指定的对象进行比较。
Comparable
Java中的Java用于实现对象的自然排序。在Java API String中,Date和wrapper类实现Comparable
接口。
如果有任何类实现Comparable
界面在Java中则该对象的集合两种List
或Array
可以通过使用自动排序Collections.sort()
或Array.sort()
方法和对象将基于由定义有自然顺序进行排序compareTo
的方法。
例如,Comparable
用Java 实现的对象可以用作排序映射中的键或排序集中的元素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);
}
}
单击链接以查看更多示例。比较的