第十二条: 考虑实现Comparable接口
(注意本文不适合学习,纯属个人笔记)
1. Comparable接口介绍
一个类,如果实现了Comparable接口,我们可以很容易的将它在数组或是集合中进行排序。so。。。Comparable这个接口是用来实现对象排序的。
假设有这么一个类:
public class CompObj implements Comparable<CompObj> {
private int age;
private String name;
public CompObj(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
//重点在这,这是接口中唯一的一个方法
@Override
public int compareTo(@NonNull CompObj another) {
return this.age - another.age;
}
}
然后我们可以这样对他进行排序:
List<CompObj> list = ...;//初始化一个list
Collections.sort(list); //集合排序,就是这么简单
CompObj array[] = ...;//初始化一个数组
Arrays.sort(list); //数组排序,就是这么简单
现在对comparaTo()方法进行简单说明。
comparaTo()方法传入该类的另外一个实例,返回一个int值,这个方法每执行一次都是对传入的对象和和本生对象进行比较。返回的int值如果是一个正值(不包括零)则在数组或是集合中交换两个实例的位置,否则位置保持不变。
2. 为什么要考虑实现Comparable接口
实现了Comparable接口的类,可以很好的和集合类或是一些泛型算法很好的协作,你可以付出很小的代价实现强大的功能。
3. 什么时候应该考虑是想Comparable接口
(1)你写的类是一个值类(前面的文章介绍过)。
(2)类中有很明显的内在排序关系,如字母排序、按数值顺序或是时间等。
(3)前面两者是并且关系。
4. 如何很好的实现Comparable接口
(1)满足对称性。
即对象A.comparaTo(B) 大于0的话,则B.comparaTo(A)必须小于0;
(2)满足传递性。
即对象A.comparaTo(B) 大于0,对象B.comparaTo(Z)大于0,则对象A.comparaTo(Z)一定要大于0;
(3)建议comparaTo方法和equals()方法保持一致。
即对象A.comparaTo(B)等于0,则建议A.equals(B)等于true。
(4)对于实现了Comparable接口的类,尽量不要继承它,而是采取复合的方式。