考虑实现Comparable接口

第十二条: 考虑实现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接口的类,尽量不要继承它,而是采取复合的方式。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • compareTo方法并没有在Object中声明。相反,它是Comparable接口中唯一的一个方法。compar...
    郭_4d5f阅读 763评论 0 1
  • 什么是Comparable接口? Comparable接口一般用于表示某个实例具有内在的排序关系。 为什么需要实现...
    大海孤了岛阅读 1,946评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,351评论 11 349
  • 摘自http://www.zhangxinxu.com/wordpress/2011/10/js%E7%AE%97...
    kabem阅读 213评论 0 0