1. Comparable
Comparable中有唯一的方法compareTo方法,一个类实现了Comparable接口就表明它的实例具有内在的排序关系,给实现了compareTo接口的实例数组排序:
Arrays.sort(a);
java平台类库中所有值类,自己所有的枚举类型都实现了Comparable接口,如果要实现的类具有内在的排序关系,一定要实现Comparable接口。
public interface Comparable<T>{int compareTo(T t);}
compareTo方法在小于,等于大于分别返回一个负数,0,正数,由于类型无法比较则抛出ClassCastException异常。
这里区别一下compareTo和equals方法,通常建议下面这样,但这并非必要。一般如果实现了Comparable接口,但是不满足下面这个等式,都应该语义说明。推荐使用这样的说法:注意,该类具有内在的排序功能,但是和equals不一致。
(x.compareTo(y)==0) == (x.equals(y))
compareTo和equals区别:
- equals允许两个不同类别对象进行比较,而compareTo不允许这样的操作,会抛出ClassCastException异常。
- TreeSet,TreeMap,Collections,Arrays都很依赖compareTo方法,内部都有搜索和排序算法。
- TreeSet关注的是compareTo而HashSet关注的是equals,如下例子
public class HashSetAndTreeSetCompare {public static void main(String[] args) {BigDecimal bigDecimal1 = new BigDecimal("1.0");BigDecimal bigDecimal2 = new BigDecimal("1.00");HashSet<BigDecimal> hashSet = new HashSet<>();TreeSet<BigDecimal> treeSet = new TreeSet<>();hashSet.add(bigDecimal1);hashSet.add(bigDecimal2);treeSet.add(bigDecimal1);treeSet.add(bigDecimal2);System.out.println("treeset output : " + treeSet.toString());System.out.println("hashset output : " + hashSet.toString());}}//treeset output : [1.0]//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;
public int getFirst() {return first;}public void setFirst(int first) {this.first = first;}public int getMid() {return mid;}public void setMid(int mid) {this.mid = mid;}public int getLast() {return last;}public void setLast(int last) {this.last = last;}private int last;public PhoneNumber(int first, int mid,int last){this.first = first;this.mid = mid;this.last = last;}}private static final Comparator<PhoneNumber> COMPARATOR =Comparator.comparingInt((PhoneNumber pn)->pn.getFirst()).thenComparingInt(pn->pn.getMid()).thenComparingInt(pn->pn.getLast());
}
```
