Comparable
package java.lang;
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator
package java.util;
public interface Comparator<T> {
//必须实现的方法
int compare(T o1, T o2);
//选择实现
boolean equals(Object obj);
}
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
相同点
- 两者都是用来用作对象之间的比较,都可以自定义比较规则;
- 两者都是返回一个描述对象之间关系的int;
区别:
- comparable 在java.lang包下,comparator在java.util包下;
- 实现comparable 必须重写compareTo(T o),实现comparator必须重写compare(T o1,T o2);
- comparable是内在比较器,表示这个类的对象直接可以相互比较this.compareTo(this),该类支持排序,这个类对象组成的集合就可以直接使用Collections.sort方法排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。comparator是外在比较器,如果想比较两个类又没有实现comparable或者想实现比较排序的,可以用Comparator.compara(o1,o2);
- comparator 是典型的策略模式(策略模式指定义一组算法类,将每个算法实现封装起来,让他们可以相互替换,不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。)每个类都可以实现comparator,都可以实现比较排序;
- Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
- 使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是不用修改原先的类的实现一个新的比较器 。Comparator实际应用广,
Comparable与Comparator详解

本文深入解析了Java中Comparable与Comparator接口的区别与联系,探讨了它们在对象比较与排序中的作用,以及如何在不同场景下选择使用。强调了Comparable作为内在比较器的自然排序特性,而Comparator作为外在比较器的灵活性。
2583

被折叠的 条评论
为什么被折叠?



