本文来自 Taking_fish 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u014133299/article/details/78608454?utm_source=copy
简介
Comparable接口
该接口对每个实现它的类的对象强加了排序规则。该排序称之为自然排序(natural ordering)。方法public int compareTo(T o)是自然排序的排序方法。
实现了comparable接口类的List或者arrays对象可以通过调用以下方法进行排序:
1. Collections#sort(List<T> list) //内部是调用第二个方法进行排序
2. Arrays#sort(Object[] a) //算法是合并排序或二分排序 n^2算法复杂度
//此外,可以通过将元素添加到一下集合或Map中实现排序
3. SortedMap tm = new TreeMap();
4. SortedSet ts = new TreeSet();
自然排序中,e1.compareTo(e2) == 0的布尔值应该等价于e1.equals(e2)。注意null不属于任何类的实例,故e.compareTo(null)应抛出空指针异常,尽管此时e.equals(null)为false。
实际上,所有实现comparable的类中方法compareTo和equals方法值是等价的。一个特例就是java.math.BigDecimal。
Comparator接口
通过比较两个入参得到顺序。返回值有三种:
1,入参一大于入参二。
0,入参相同。
-1,入参一小于入参二。
实现的类必须保证以下 要求:
sgn(compare(x, y)) == -sgn(compare(y, x))。暗示着compare(x, y)抛异常,则compare(y,x)也抛异常。
((compare(x, y) < 0),((compare(y,z) < 0)暗示着((compare(x,z) < 0)。
compare(x, y)==0暗示着sgn(compare(x, z))==sgn(compare(y, z))。
参数 | Comparable | Comparator |
---|---|---|
排序逻辑 | 排序逻辑必须在待排序对象的类中,故称之为自然排序 | 排序逻辑在另一个实现 |
实现 | 实现Comparable接口 | 实现Comparator接口 |
排序方法 | int compareTo(Object o1) | int compare(Object o1,Object o2) |
触发排序 | Collections.sort(List) | Collections.sort(List, Comparator) |
接口所在包 | java.lang.Comparable | java.util.Comparator |