java中Comparable与comparator区别
comparable
comparable对实现它的每个类的进行排序,这个接口的方法需要类本身去具体实现。 一般来说,在创建一个类时,如果这个具有排序的属性,最好去实现这个接口。
比如需要对一个具有人属性的类的对象进行排序,就需要实现这个接口,对类的某个属性实现排序。这里只有一个年龄属性。有多个属性也一样。
内部比较器的实现
```java
class Person implements Comparable<Person>{
private int age;
public Person(int age){
this.age=age;
}
@Override
public int compareTo(Person o) {
return this.age-o.age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
}
测试代码
```java
public static void main(String[] args) {
Person p1=new Person(23);
Person p2=new Person(24);
Person[]arr=new Person[2];
arr[0]=p2;
arr[1]=p1;
Arrays.sort(arr);
System.out.println(arr[0]);
}
结果:
Person{age=23}
可以看出经过排序,年龄小的对象在前面实现了对类的排序。
```java
Comparator
如果一个类无法修改,可以采用外部比较器Comparator
public static void main(String[] args) {
Person p1=new Person(23);
Person p2=new Person(24);
List<Person>list=new ArrayList<>();
list.add(p2);
list.add(p1);
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
if(o1==null||o2==null){
return 0;
}
return o1.getAge()-o2.getAge();
}
});
System.out.println(list);
}
[Person{age=23}, Person{age=24}]
同样实现了升序排序;
两者区别
comparable是排序接口,对某个类的对象进行排序时需要实现它。而comparator是外部比较器,就没有implements这一说法,对于一个类无法修改了,可以用外部比较器。我们若需要控制某个类的次序,可以建立一个该类的比较器进行排序。