1.个人理解
当相对引用类型的进行排序时,我们可以使用Collections.sort(List<T> list)或Collections.sort(List<T> list,
Comparator<? super T> c)和(Arrays.sort)对对象集进行排序,但在排序之前要制定排序的规则,这时
就需要使用Comparable与Comparator接口实现排序规则。
Comparable(自然排序):Comparable属于一个内部排序,一个对象想要拥有排序的功能,则需要实现Comparable
接口并重写compareTo方法(定义自己的排序规则);
Comparator(比较器):Comparator属于一个外部排序,一个对象并没有实现Comparable接口时还想实现排序时,
则可以使用Comparator接口重写compare方法定义排序规则进行实现。
2.案例
Comparable
public class User implements Comparable<User>{
String name;
int age;
public User() {
}
public User(String name, int age) {
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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(User o) {
if (this.age > o.getAge()){
return 1;
}
if (this.age< o.getAge()){
return -1;
}
return 0;
}
}
public class Demo01 {
public static void main(String[] args) {
User[] users = {
new User("x",16),new User("a",5)};
Arrays.sort(users);
Arrays.stream(users).forEach(System.out::println);
}
}
User{
name='a', age=5}
User{
name='x', age=16}
Comparator
public class User {
String name;
int age;
public User() {
}
public User(String name, int age) {
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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Demo01 {
public static void main(String[] args) {
User[] users = {
new User("x", 16), new User("a", 5)};
Arrays.sort(users, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
if (o1.getAge() > o2.getAge()) return 1;
if (o1.getAge() < o2.getAge()) return -1;
return 0;
}
});
Arrays.stream(users).forEach(System.out::println);
}
}
User{
name='a', age=5}
User{
name='x', age=16}
3.注意
当Comparable和Comparator同时存在时,Comparator的优先级更高