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());
}
```