Comparable和Comparator都是用作元素比较的接口,Comparable位于java.lang包下,Comparator位于java.util包下,从名字以及路径可以大概看出来,Comparable倾向于使得实现该接口的类本身成为可比较的(常见的例如Cloneable,Serializable,当然Serializable处于java.io包下,因为人家更偏于表现出可传输特性),都是表明拥有了某种能力;Comparator则是一种用于比较的工具。
Comparable
只有一个方法
int compareTo(T o)
返回负数,零,正数分别表示隐式对象小于、等于、大于比较对象o。
示例:
public class t{
public static void main(String[] args) {
Person p1=new Person("ac",3);
Person p2=new Person("ab",2);
List<Person> arr=new ArrayList<Person>();
arr.add(p1);
arr.add(p2);
Collections.sort(arr);
System.out.println(arr.get(0)+"\n"+arr.get(1));
}
}
class Person implements Comparable<Person>{//先按照名字排序,名字相同按照年龄
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "name:"+name+" age:"+age;
}
public int compareTo(Person ano){
int i=name.compareTo(ano.name);
if(i==0){
return age-ano.age;
}else{
return i;
}
}
}
Comparator
需要实现方法
int compare(T o1,To2)
compare方法可以表示相等的情况,闲着无聊也可以在实现类内部重写equals方法,不写的话类本身继承Object中的equals表示隐式对象与比较对象是同一个对象
public boolean equals(Object obj) {
return (this == obj);
}
Comparator作为一种比较器,对某种类型的数据提供比较支持
示例:
public class t{
public static void main(String[] args) {
Person p1=new Person("ac",3);
Person p2=new Person("ab",2);
List<Person> arr=new ArrayList<Person>();
arr.add(p1);
arr.add(p2);
Collections.sort(arr,new PersonComparator());
System.out.println(arr.get(0)+"\n"+arr.get(1));
}
}
class PersonComparator implements Comparator<Person>{
public int compare(Person one,Person ano){
int i=0;
i=one.getName().compareTo(ano.getName());
if(i==0){
return one.getAge()-ano.getAge();
}else{
return i;
}
}
}
class Person {
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public String toString(){
return "name:"+name+" age:"+age;
}
}
从比较函数可以看出,Comparable的compareTo方法对传入的对象进行比较,对象内部是可以实现比较的;Comparator的compare方法对传入的两个对象进行比较,比较策略定义在Comparator类内部,属于一种策略模式,当需要更换比较策略时,直接换个Comparator即可。
总结
Comparable实现自身的比较功能,但是比较策略与源代码耦合在一起,修改比较规则时需要更改源代码,Comparator提供比较工具,将对象的比较规则定义在另一个类中,实现了可替换。