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;}@Overridepublic 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> {@Overridepublic int compare(Person p1, Person p2) {//升序: 比较对象1 - 比较对象2return 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>() {@Overridepublic 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