Java中的Comparable 和 Comparator
Comparable介绍
Comparable位于java.lang
包下,含义为可比较的,故当要求一个类具备比较功能时,要实现Comparable接口。
Comparable接口源码如下:
package java.lang; import java.util.*; public interface Comparable<T> { public int compareTo(T o); }
当类实现这个接口时,需要实现compareTo方法。
实现原则:假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。(JDK的sort函数如Arrays.sort是按这个原则来判断两个对象之间的大小的,具体的内部实现由我们自己定义。我们甚至可以采用相反的方式来定义,从例如sort排序默认是升序,如果我们内部采用相反的排序规则,x大于y返回-1,x小于y返回1,这样就可以实现降序)
Comparator介绍
Comparator是一个比较器接口,当我们需要对一系列对象进行排序时,可以通过实现Comparator接口,来实现自定义排序方式。
Comparator接口源码如下:
package java.util; public interface Comparator<T> { int compare(T o1, T o2); ...//other methods }
实现原则:int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
两者比较
通过一个例子来说明Comparable的作用:
public class CompareDemo { public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person(1,"xiaoma")); list.add(new Person(2,"xiaoli")); Collections.sort(list); } } //如果不实现Comparable接口,前面的Collections.sort将会报错。 class Person implements Comparable<Person> { int age; String name; Person(int age,String name){ this.age=age; this.name=name; } @Override public int compareTo(Person o) { if(age>o.age){ return 1; }else if(age==o.age){ return 0; }else return -1; } }
在上面例子的基础上,我们定义自己的比较器,如下:
public class CompareDemo { public static void main(String[] args) { List<Person> list = new ArrayList<>(); list.add(new Person(1,"xiaoma")); list.add(new Person(2,"xiaoli")); //此处添加一个比较器 Collections.sort(list, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o2.age-o1.age; } }); } } class Person implements Comparable<Person> { int age; String name; Person(int age,String name){ this.age=age; this.name=name; } @Override public int compareTo(Person o) { if(age>o.age){ return 1; }else if(age==o.age){ return 0; }else return -1; } }
通过上面的例子,我们可以简单理解,Comparable类比内部比较器,Comparator类似一个外部比较器。