相同点:java
Comparable和Comparator都是接口,用来作对象的比较而达到排序的目的。算法
不一样点:ide
Comparable须要类自己实现它,并重写compareTo方法,参数为另一个同类的对象,排序的时候使用Collections.sort(Collection cl),一般是在项目中自定义的类,特别是后期须要排序的类。this
package collections; public class Person implements Comparable<Person> { private int age; private String name; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person o) { return this.age-o.age; } @Override public String toString() { return name+":"+age; } }
Person person1 = new Person("AA",17); Person person2 = new Person("BB",18); Person person3 = new Person("CC",19); List<Person> list = new ArrayList<>(); list.add(person1); list.add(person2); list.add(person3); Collections.sort(list);
Comparator是须要独立的类来实现它,并重写compare和equals方法,一般是用在没法继承或者更改的类状况,使用Collections.sort(Collection cl,Comparator cp)进行排序code
Person p1 = new Person("AA",18); Person p2 = new Person("BB",17); Person p3 = new Person("CC",19); List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); Collections.sort(list,new Comparator<Person>(){ @Override public int compare(Person o1, Person o2) { if(o1 == null || o2 == null) return 0; return o1.getAge()-o2.getAge(); } });
在《Effective Java》一书中,做者Joshua Bloch推荐你们在编写自定义类的时候尽量的考虑实现一下Comparable接口,一旦实现了Comparable接口,它就能够跟许多泛型算法以及依赖于改接口的集合实现进行协做。你付出很小的努力就能够得到很是强大的功能对象