Comparable:自然排序比较,被元素本身实现。
Comparator:比较器接口,用于集合实现
用程序解释更加清晰,有时候这两种可以转换,但是有时候不能转换,比较器可以根据自己的需要自定义比较条件
TreeSet内部数据结构是二叉树结构
comparable解释
class Person implements Comparable{//元素自身的排序
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(Object o) {//覆盖接口的compareTo()方法,来定义元素自身排序的条件
Person person = (Person) o;
int temp = this.age - person.age ;
return temp==0?this.name.compareTo(person.name):temp;//如果当前对象的值比另一个对象值大返回正。小返回负数,0相等
}
此种排序,是元素自身实现的,不用单独调用。
Comparator解释
class ComparatorByName implements Comparator{//实现比较器接口
@Override
public int compare(Object o1, Object o2) {//覆盖比较器的方法。
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int temp = p1.getName().compareTo(p2.getName());
return temp==0?p1.getAge()-p2.getAge():temp;//返回值意思和上一个排序一样
}
TreeSet ts = new TreeSet(new ComparatorByName());//由于该比较器是一个单独的比较器,如果在某一个集合中使用,必须声明该集合使用的是该比较器对象。
如果一个集合既有Comparator,又有Comparable
则compartor优先级更高 |