Comparable 是排序接口:
如果一个类实现了Comparable接口,则说明该类支持排序。
由 实现了Comparable接口的类的对象 组成的List列表或者数组,可以直接通过Collection.sort(或者Arrays.sort)进行排序。
实现了Comparable接口的类的对象可以用作“有序映射(TreeMap)”的键或则会“有序结合(TreeSet)”中的元素,而不用指定比较器。
Comparable接口只包含一个方法,定义如下:
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); }
通过重写compareTo方法,自定义对象的排序方式。
Comparator 是比较器接口:
如果我们需要控制某个类的次序,而这个类不支持排序排序(即没有实现Comparable接口);那么我们就建立一个该类的 比较器 来进行比较,这个类的比较器只需要 Comparator的接口即可。
Comparator接口包含两个方法,定义如下:
package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
实现该接口的类必须实现compare(T o1,T o2)方法,但是equals方法可以不实现,因为Object中已经对equals方法进行了实现,也就是说所有的对象中都已经实现了equals方法。
Comparable接口 和 Comparator接口的区别:
Comparable接口相当于“内部比较器”,Comparator接口相当于“外部比较器”
/** Person 实现了Comparable接口,因此Person类是支持排序的 **/ public class Person implements Comparable<Person> { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Person(String name, Integer age){ this.name = name; this.age = age; } @Override public int compareTo(Person person) { // 通过Person类的某一个字段对该类进行排序 // 升序方式 return age.compareTo(person.getAge()); } }
排序器的实现:
public class ComparatorTest implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { // 降序 return o2.getAge().compareTo(o1.getAge()); } }
public class CompareTest { public static void main(String[] args) { List<Person> personList = new ArrayList<>(); personList.add(new Person("40岁的",40)); personList.add(new Person("10岁的",10)); personList.add(new Person("30岁的",30)); personList.add(new Person("20岁的",20)); for(Person person : personList){ System.out.println("原始序列:"+person.getName()+"_"+person.getAge()); } Collections.sort(personList); for(Person person : personList){ System.out.println("Comparable排序后序列:"+person.getName()+"_"+person.getAge()); } Collections.sort(personList,new ComparatorTest()); for(Person person : personList){ System.out.println("Comparator排序后序列:"+person.getName()+"_"+person.getAge()); } } }
原始序列:40岁的_40 原始序列:10岁的_10 原始序列:30岁的_30 原始序列:20岁的_20 Comparable排序后序列:10岁的_10 Comparable排序后序列:20岁的_20 Comparable排序后序列:30岁的_30 Comparable排序后序列:40岁的_40 Comparator排序后序列:40岁的_40 Comparator排序后序列:30岁的_30 Comparator排序后序列:20岁的_20 Comparator排序后序列:10岁的_10