Comparable和Comparator的区别

Comparable

Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。

Comparable接口是内比较器,也就是自己参与比较,需要实现compareTo方法。Comparable的compareTo方法需要传入一个对象,然后自己和该对象比较。

有三种情况

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

package algorithm;

public class Person implements Comparable<Person> {    //Comparable后面的泛型不一定和当前类一样,可以是别的类,只要能把compareTo的算法写好就行,并不要求相同class比较。但是如果想要使用Collections.sort或Arrays.sort进行自动排序就必须是相同的class。

	private String name;

	public Person() {

	}

	public Person(String name) {
		this.name = name;
	}

	public int compareTo(Person person) {
		if (this.name.compareTo(person.name) > 0)
			return 1;
		else if (this.name.compareTo(person.name) == 0)
			return 0;
		else
			return -1;
	}

	public String getName() {
		return name;
	}

}
 
public static void main(String[] args) throws Exception {
	Person d1 = new Person("c");
	Person d2 = new Person("c");
	Person d3 = new Person("b");
	Person d4 = new Person("d");
	System.out.println(d1.compareTo(d2));
	System.out.println(d1.compareTo(d3));
	System.out.println(d1.compareTo(d4));
}

 结果

0
1
-1

Comparator 

Comparetor是外比较器,相当于它本身不作为比较的对象,它提供的是一个比较平台。

package algorithm;

public class Person {

	private String name;

	public Person() {
	}

	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

}
public static void main(String[] args) throws Exception {
		Person d1 = new Person("c");
		Person d2 = new Person("a");
		Person d3 = new Person("b");
		List<Person> persons = new ArrayList<>();
		persons.add(d1);
		persons.add(d2);
		persons.add(d3);
		List<Person> orderPersons = sort(persons);;
		for(Person person:orderPersons){
			System.out.println(person.getName());
		}
	}
	
	 public static List<Person> sort(List<Person> persons){
	      Collections.sort(persons, new Comparator<Person>(){
	           public int compare(Person o1, Person o2) {
	        	   if (o1.getName().compareTo(o2.getName()) > 0)
	       			return 1;
	       		else if (o1.getName().compareTo(o2.getName()) == 0)
	       			return 0;
	       		else
	       			return -1;
	           }

	      });
	  return persons;
	 }

 结果是

a
b
c

这个是Comparator的匿名类的用法,当然也可以实现一个接口,哪个类实现了该接口就是作为一个比较器。

Comparator的用法耦合度会低一些。