相同點: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接口,它就能夠跟許多泛型算法以及依賴於改接口的集合實現進行協做。你付出很小的努力就能夠得到很是強大的功能對象