-
1. Comparable
-
2. Compator
-
3. Comparable 和 Compator 的区别
1.Comparable 是一个接口,代码如下, 其中T就是要比较的对象。
public interface Comparable<T> {
public int compareTo(T o);
}
对于一个类Person 有两个属性 年龄和姓名,需求是我们根据其中的年龄进行排序。
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
要比较,我们需要对用Person类实现Comparable接口,我们再代码里用到了Arrays.sort()来对数组进行排序,数组中的每个元素是实现了Comparable接口的对象,具体代码如下:
import java.util.Arrays;
public class Person implements Comparable<Person> {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compareTo(@NotNull Person o) {
return this.age - o.getAge();
}
public static void main(String[] args) {
Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
System.out.println("原来的顺序");
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
System.out.println();
System.out.println("后来的顺序");
Arrays.sort(personArray);
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
}
}
运行结果如图 :
我们可以看到要对对象进行排序,需要更改该对象对应的类的源码。
2.Compator
Comapator接口,该接口有个compare 方法, 我们写的实现类只需重写该方法就可以了
public interface Comparator<T> {
int compare(T o1, T o2);
其余的一些方法...
}
但是Compator 接口也有更多的 其他方法,感兴趣的可以去看看
Person 类
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
}
我们只需写一个比较器类,该类实现了Compator<T> 接口即可。
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorPerson implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
public static void main(String[] args) {
Person[] personArray = new Person[]{new Person(10, "Liam"), new Person(7, "Bob")};
System.out.println("原来的顺序");
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
System.out.println();
System.out.println("后来的顺序");
Arrays.sort(personArray, new ComparatorPerson());
for (Person person : personArray) {
System.out.print(person.getName() + "----" + person.getAge() + " ");
}
}
}
得出的结果是和使用Comparable结果是一致的,只是这个地方不用再源码Person上修改代码,而是新建一个比较器类
3.Comparable和Compator两个的区别
Comparable 的使用,我们需要在源码Person上重写compareTo方法,而在Compator的使用中我们无需在源码Person上重写相关的方法,而是只需要新建一个比较器类即可,该比较器实现了Compator接口的compare方法。所以Comparable可以称之为内部比较器,而Compator可以称之为外部比较器。