1. Comparable

Comparable中有唯一的方法compareTo方法,一个类实现了Comparable接口就表明它的实例具有内在的排序关系,给实现了compareTo接口的实例数组排序:

  1. Arrays.sort(a);

java平台类库中所有值类,自己所有的枚举类型都实现了Comparable接口,如果要实现的类具有内在的排序关系,一定要实现Comparable接口。

  1. public interface Comparable<T>{
  2. int compareTo(T t);
  3. }

compareTo方法在小于,等于大于分别返回一个负数,0,正数,由于类型无法比较则抛出ClassCastException异常。
这里区别一下compareTo和equals方法,通常建议下面这样,但这并非必要。一般如果实现了Comparable接口,但是不满足下面这个等式,都应该语义说明。推荐使用这样的说法:注意,该类具有内在的排序功能,但是和equals不一致。

  1. (x.compareTo(y)==0) == (x.equals(y))

compareTo和equals区别:

  1. equals允许两个不同类别对象进行比较,而compareTo不允许这样的操作,会抛出ClassCastException异常。
  2. TreeSet,TreeMap,Collections,Arrays都很依赖compareTo方法,内部都有搜索和排序算法。
  3. TreeSet关注的是compareTo而HashSet关注的是equals,如下例子
    1. public class HashSetAndTreeSetCompare {
    2. public static void main(String[] args) {
    3. BigDecimal bigDecimal1 = new BigDecimal("1.0");
    4. BigDecimal bigDecimal2 = new BigDecimal("1.00");
    5. HashSet<BigDecimal> hashSet = new HashSet<>();
    6. TreeSet<BigDecimal> treeSet = new TreeSet<>();
    7. hashSet.add(bigDecimal1);
    8. hashSet.add(bigDecimal2);
    9. treeSet.add(bigDecimal1);
    10. treeSet.add(bigDecimal2);
    11. System.out.println("treeset output : " + treeSet.toString());
    12. System.out.println("hashset output : " + hashSet.toString());
    13. }
    14. }
    15. //treeset output : [1.0]
    16. //hashset output : [1.0, 1.00]

    2. Comparator

    java1.8之后通常使用Comparator接口比较丝滑。Comparator接口内部有很多静态方法结合lambda表达式排序很方便。 ```java package item14;

import java.util.Comparator;

public class ComparatorTest { public class PhoneNumber{ private int first; private int mid;

  1. public int getFirst() {
  2. return first;
  3. }
  4. public void setFirst(int first) {
  5. this.first = first;
  6. }
  7. public int getMid() {
  8. return mid;
  9. }
  10. public void setMid(int mid) {
  11. this.mid = mid;
  12. }
  13. public int getLast() {
  14. return last;
  15. }
  16. public void setLast(int last) {
  17. this.last = last;
  18. }
  19. private int last;
  20. public PhoneNumber(int first, int mid,int last){
  21. this.first = first;
  22. this.mid = mid;
  23. this.last = last;
  24. }
  25. }
  26. private static final Comparator<PhoneNumber> COMPARATOR =
  27. Comparator.comparingInt((PhoneNumber pn)->pn.getFirst()).
  28. thenComparingInt(pn->pn.getMid()).thenComparingInt(pn->pn.getLast());

}

```