1. 字面含义不同
Comparable字面意思是“具有比较能力”,Comparator字面意思是“比较器”。
2. 用法不同
Comparable用法:对需要排序的类,实现Comparable接口,重写compareTo()方法。
Comparator用法:创建自定义比较器,实现Comparator接口,重写compare()方法。还可以通过匿名类的方式更快速便捷的完成自定义比较器的功能。
3. 使用场景不同
Comparable必须修改原有的类,也就是说要排序哪个类,就要在哪个类中实现Comparable接口,并重写compareTo()方法。所以Comparable更像对内进行排序。
Comparator无需修改原有类,也就是说,通过Comparator接口可以实现和原有类的解耦,在不修改原有类的情况下,实现排序功能,所以Comparator可以看做对外提供排序的接口。
4. 示例
4.1 没有实现任何接口
package test;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.ArrayList;
public class test1 {
public static void main(String[] args) {
//创建对象
Person p1 = new Person(1, 18, "Java");
Person p2 = new Person(2, 22, "MySQL");
Person p3 = new Person(3, 6, "Redis");
//添加到集合
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
//打印集合信息
for (Person p : list) {
System.out.println(p.getName() + ": " + p.getAge());
}
}
}
@Getter
@Setter
@ToString
class Person{
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
运行结果:
Java: 18
MySQL: 22
Redis: 6
从运行结果看到,没有进行任何排序操作
4.2 实现Comparable接口
package test2;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.ArrayList;
import java.util.Collections;
public class test2 {
public static void main(String[] args) {
//创建对象
Person p1 = new Person(1, 18, "Java");
Person p2 = new Person(2, 22, "MySQL");
Person p3 = new Person(3, 6, "Redis");
//添加到集合
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
Collections.sort(list);
//打印集合信息
for (Person p : list) {
System.out.println(p.getName() + ": " + p.getAge());
}
}
}
@Getter
@Setter
@ToString
class Person implements Comparable<Person> {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
@Override
public int compareTo(Person p) {
//降序:比较对象-当前对象
return p.getAge() - this.getAge();
//升序:当前对象-比较对象
//return this.getAge()-p.getAge();
}
}
运行结果:
MySQL: 22
Java: 18
Redis: 6
4.3 实现Comparator接口
package test3;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class test3 {
public static void main(String[] args) {
//创建对象
Person p1 = new Person(1, 18, "Java");
Person p2 = new Person(2, 22, "MySQL");
Person p3 = new Person(3, 6, "Redis");
//添加到集合
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
//进行排序操作(根据PersonComparator中定义的排序规则排序)
Collections.sort(list,new PersonComparator());
//打印集合信息
for (Person p : list) {
System.out.println(p.getName() + ": " + p.getAge());
}
}
}
/**
* 用于Person类的比较器
*/
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
//升序: 比较对象1 - 比较对象2
return p1.getAge()-p2.getAge();
//降序: 比较对象2 - 比较对象1
//return p2.getAge()-p1.getAge();
}
}
@Getter
@Setter
class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
运行结果:
Redis: 6
Java: 18
MySQL: 22
4.4 使用Comparator匿名类
package test4;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Comparator;
public class test4 {
public static void main(String[] args) {
//创建对象
Person p1 = new Person(1, 18, "Java");
Person p2 = new Person(2, 22, "MySQL");
Person p3 = new Person(3, 6, "Redis");
//添加到集合
ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
//使用Comparator匿名类
list.sort(new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
//升序
return p1.getAge()-p2.getAge();
}
});
//打印集合信息
for (Person p : list) {
System.out.println(p.getName() + ": " + p.getAge());
}
}
}
@Getter
@Setter
class Person {
private int id;
private int age;
private String name;
public Person(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
}
运行结果:
Redis: 6
Java: 18
MySQL: 22