一:Comparable接口初识
- 是一个接口,定制排序规则,对实现它的每个类的对象进行整体排序,里面 compareTo 方法是实现排序的具体方法
- 比如TreeSet、SortedSet、Collections.sort() 方法调用进行排序
- String、Integer等类默认实现了这个接口,所以可以排序(看源码)
- 表达方式
public interface Comparable<T> {
public int compareTo(T o);
}
- 详解compareTo方法
- 用于比较当前对象和传进来对象的大小,o为要比较的对象
- 返回int类型
- 大于0, 表示this大于传进来的对象o ,则往后排,即升序
- 等于0,表示this等于传进来的对象o
- 小于0,表示this小于传进来的对象o
二:案例实操
需求:根据学生年龄,进行排序
- 代码理解:
- Student 实现 Comparable接口(public class Student implements Comparable)
- 创建Student类,重写compareTo方法( @Override)
- Student another(参数为传进来比较的对象)
package chapter9;
public class Student implements Comparable<Student> {
private String name;
private int age;
private int height;
public Student(){
}
public Student(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
}
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;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
'}';
}
@Override
public int compareTo(Student another) {
return this.age - another.age;
}
}
- 创建运行类ComparableDemo.java,查看运行效果
package chapter9;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
public class ComparableDemo {
public static void main(String[] args) {
Set<Student> set = new TreeSet<>();
set.add(new Student("老王",20,170));
set.add(new Student("大钊",32,178));
set.add(new Student("张三",24,150));
set.add(new Student("冰冰",29,172));
set.add(new Student("小DD",31,175));
System.out.println(set);
}
}
三:总结
- 如果类的自然排序逻辑就是所需要的排序方式,并且不会改变,那么应该实现Comparable接口。
- 如果需要为类提供多种排序方式,或者需要对没有实现Comparable接口的类进行排序,那么应该使用Comparator。
- Comparator提供了更高的灵活性,它允许为同一个类定义多个不同的排序方式,并且可以用于比较任何对象
- Comparable在类的自然排序逻辑简单,且不会改变的情况下更为方便。