1 两个接口的定义
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);//object的
}
public interface Comparable<T> {
public int compareTo(T o);
}
2 区别
<T extends Comparable<? super T>> void java.util.Collections.sort(List<T> list)
<T> void java.util.Collections.sort(List<T> list, Comparator<? super T> c)
Comparator是比较器,是策略模式,不改变对象自身,而用一个策略对象来改变它的行为。
Comparable规定了一个类的“自然顺序”(nature order)。继承它的类需要实现compareTo 接口。
Collections.sort(list,comparator), Arrays.sort(list, comparator);以及有序的Set(TreeSet)和Map(TreeMap)可以用到Comparator来指定比较器。
如果集合元素实现了Comparable接口,则Collections.sort,Arrays.sort有序的set和map就可以不指定比较器而自动排序。
3 联系
List<Boolean> ll = Arrays.asList(true,false,true,false);
ll.sort((x, y)->Boolean.compare(x, y));
ll.sort(Boolean::compare);
即
Comparator<Boolean> c = Boolean::compare;
等价于
Comparator<Boolean> c = new Comparator<Boolean>() {
@Override
public int compare(Boolean x, Boolean y) {
return Boolean.compare(x, y);
}
};
4 其他
Comparable是java.lang下
Comparator是java.util下。
这个跟java.util.Iterator和java.lang.Iteratable是一样的。