美文网首页effectivejava
考虑实现Comparable接口

考虑实现Comparable接口

作者: 想飞的僵尸 | 来源:发表于2016-07-07 23:19 被阅读406次

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

    相关文章

      网友评论

        本文标题:考虑实现Comparable接口

        本文链接:https://www.haomeiwen.com/subject/wdvljttx.html