0
点赞
收藏
分享

微信扫一扫

《Java 核心技术 卷1》 笔记 第六章 接口和内部类

东林梁 2022-02-02 阅读 88

6.1 接口

接口:不是类,是对类的一组需求的描述

自然排序:如果对于某种类,它的排列规则是相同的,那么可以考虑通过实现Comparable来完成自然排序

源码这段说明很长,但是挺重要的,主要说明了几个实现Comparable类的规则:

  1. x.compareTo(y) 的符号应该与 y.compareTo(x) 的符号是相反的
  2. 如果 x.compareTo(y) 抛出异常,则 y.compareTo(x) 也应该抛出异常
  3. 实现类需要确保正负号的传递性:

𝑥.𝑐𝑜𝑚𝑝𝑎𝑟𝑒𝑇𝑜𝑦>0𝑦.𝑐𝑜𝑚𝑝𝑎𝑟𝑒𝑇𝑜𝑧>0⟹𝑦.𝑐𝑜𝑚𝑝𝑎𝑟𝑒𝑇𝑜𝑧>0

  1. 如果x.compareTo(y)==0 那么要确保 x.compareTo(z) 的符号与 y.compareTo(z) 的符号是一致的
  2. x.compareTo(y)==0 并不意味着 x.equals(y) , x.compareTo(y) 只是自然排序的结果,与实际 equals 的比较结果无关。
  3. 前面的符号代表着数学比较结果的正负号,小于用-1表示,等于用0表示,大于用1表示

1 indicate 表明

2 inconsistent 不一致的

3 notation 符号

4 designate 标示

5 according to 根据

Implements 关键字可以用来表示实现接口,后续部分和抽象类几乎一致:

public class Main {
    public static void main(String[] args){
      Main solution = new Main();
      Test t3 = solution.new Test(30);
      Test t2 = solution.new Test(20);
      Test t1 = solution.new Test(10);
      List<Test> list = Arrays.asList(t3,t2,t1);
      Collections.sort(list);
      System.out.println(list);
    }

    class Test implements Comparable<Test>{
        int score;
        public Test(int score){
            this.score=score;
        }

        @Override
        public int compareTo(Test o) {
            return score-o.score;
        }

        @Override
        public String toString() {
            return "Test{" +
                    "score=" + score +
                    '}';
        }
    }
}

实现接口步骤:

  1. 使用 implements 关键字表明实现的接口
  2. 覆盖接口中的所有方法

注意:接口方法访问修饰符固定为public,不写时同样代表public,不能显式声明为其他访问类型

Java中集合sort的原理:Timsort

  1. 小于32无需多路归并,大于32,分成小块多路归并,多路归并时只调整相邻分组
  2. 前面由降序排列的就把它反过来,然后在同一个块里后续的无序部分进行插入排序
  3. 归并思路:后面的块大小达到前面的一半就可以归并。对于Java来说,如果倒数第三个块的长度,小于等于倒数第二加倒数第一的长度之和或者倒数第二个块小于倒数第一个块的长度,就进行一次归并操作。
  • runLen[i - 3] <= runLen[i - 2] + runLen[i - 1]
  • runLen[i - 2] <= runLen[i - 1]

源码参考:ComparableTimSort.sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen)

资料参考:

百度百科:https://baike.baidu.com/item/TimSort/10279720?fr=aladdin

维基百科:https://en.wikipedia.org/wiki/Timsort

 系列内容

《Java 核心技术 卷1》 笔记:第一章 Java程序设计概述

《Java 核心技术 卷1》 笔记:第二章 Java程序设计环境

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(1)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(2)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(3)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(4)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(5)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(6)

《Java 核心技术 卷1》 笔记:第三章 Java基本的程序设计结构(7)大数处理、数组、多维数组、控制台传参

《Java 核心技术 卷1》 笔记 第四章:类与对象

《Java 核心技术 卷1》 笔记 第四章:类与对象(2) GregorianCalendar 与 类的基本组成

《Java 核心技术 卷1》 笔记 第四章:类与对象(3) 构造器全局私有方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(4) 静态字段+静态方法+工厂方法

《Java 核心技术 卷1》 笔记 第四章:类与对象(5) 形参与实参 构造器的默认值与默认构造

《Java 核心技术 卷1》 笔记 第四章:类与对象(6) 构造器调用与初始化块

《Java 核心技术 卷1》 笔记 第四章:类与对象(7) 注释、JavaDoc与类设计

《Java 核心技术 卷1》 笔记 第五章 继承

《Java 核心技术 卷1》 笔记 第五章 继承(2)

《Java 核心技术 卷1》 笔记 第五章 继承(3)

《Java 核心技术 卷1》 笔记 第五章 继承(4)equals方法

《Java 核心技术 卷1》 笔记 第五章 继承(5)hashCode 与 toString

《Java 核心技术 卷1》 笔记 第五章 继承(6) 泛型

《Java 核心技术 卷1》 笔记 第五章 继承(7) 包装类和可变数组

《Java 核心技术 卷1》 笔记 第五章 继承(8) 枚举类与类反射

《Java 核心技术 卷1》 笔记 第五章 继承(9) 异常捕获与反射运用

《Java 核心技术 卷1》 笔记 第五章 继承(10)反射

《Java 核心技术 卷1》 笔记 第五章 继承(11)反射泛型数组+方法指针+类设计技巧

举报

相关推荐

0 条评论