Comparable接口
使实现类自身具备某种比较规则以便对其对象进行自然排序的接口
自然排序:是要求自定义类实现comparable接口并重写其compareTo(T o)方法,在此方法中依据xx属性进行排序的算法。
-
public interface Comparable<T>
该接口对实现它的每个类的对象强加一个整体排序。这个排序被称为类的自然排序 ,类的
compareTo
方法被称为其自然比较方法 。实现此接口的对象的列表(和数组)可以自动排序
Collections.sort
(和Arrays.sort
)。实现该接口的对象,可以使用如在键sorted map或作为在元件sorted set ,而不需要指定一个comparator 。一类的自然排序
C
被说成是与equals一致 ,当且仅当e1.compareTo(e2) == 0
具有相同的布尔值e1.equals(e2)
,每e1
和e2
类C
。注意,null
不是任何类的实例,而e.compareTo(null)
应该抛出一个NullPointerException
即使e.equals(null)
返回false
。强烈建议(尽管不需要)自然排序与等于一致。这是因为,当没有显式比较器的排序集(和排序映射)与其自然排序与equals不一致的元素(或键)一起使用时会“奇怪地”。特别地,这种排序集合(或排序映射)违反了用于设定(或映射)的通用合同,其按照
equals
方法定义。例如,如果加上两个键
a
和b
使得(!a.equals(b) && a.compareTo(b) == 0)
到有序集合不使用显式的比较器,所述第二add
(有序集合不增加的大小和)操作返回false因为a
和b
是等价从排序集的角度。实际上,实现
Comparable
所有Java核心类都具有与等于一致的自然排序。一个例外是java.math.BigDecimal
,其自然排序等于BigDecimal
具有相等值和不同精度(例如4.0和4.00)的对象。对于数学倾斜,定义给定类C的自然排序的关系是:
{(x, y) such that x.compareTo(y) <= 0}.
这个总订单的商是:
{(x, y) such that x.compareTo(y) == 0}.
它从合同紧跟
compareTo
,该商数是一个等价关系C
,那自然排序是一个总的顺序C
。当我们说一个类的自然排序与equals一致时 ,我们意味着自然排序的商是由类的equals(Object)
方法定义的等价关系:{(x, y) such that x.equals(y)}.
Conparator 比较器
在外部自定义比较规则以便容器对其储存数据进行定制排序的对象;
定制排序:要求自定义类实现comparator接口并重写其compare(T o1,T o2)方法,在此方法中依据xx属性进行排序的算法,也成为比较器排序;
Comparable 接口 实现该接口的类具有排序功能,需要重写comparareTo方法,使用当前对象和参数对象进行比较
Comparator接口,不会对集合中储存的元素进行修饰;需要自定义比较器类实现改接口,重写compare方法,比较连个参数对象;需要将比较器对象以参数的形式传入集合的构造器中。
原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78867.html