你真的读懂了Java源码?Collections源码初探

发布时间 2023-06-13 12:12:08作者: izcat

最近重温Java知识,遇到不懂的问题搜索互联网/博客很难直接找到答案,还好如今有了chatGPT,比大多数CV复读机/纯文档翻译的内容更有用。很多文章总结冠以“深入理解xxx”,“万字长文详解xxx”的文章,也不过是演示一遍调用代码,让你知道了怎么用,在什么情况下用。但至于为什么这么用,以及Java语言为什么这么设计,可能大多数人也没领悟或者探索其原理和初衷。

包 Package

Collections类位于 java.util 包中。源代码第一行 package java.util; 表示Collections所在的包(Package)。java.util包还包含其他的类、接口,在同一个包下Java编译器默认会自动加载这些类。包的设计是为了方便代码的组织和管理,使用时不需要import语句导入每一个文件,也可以避免命名冲突(不同的包名下可以有相同的类名)。

静态成员

Collections是一个算法合集,可以看到构造器是由 private 修饰的,无法实例化。因此成员和方法都是 static 静态的。
接下来的代码是静态成员,注释已经说明了这些常量是为了更好算法性能的调整参数。下面所有阈值都是在元素个数较小或者支持随机访问RandomAccess的列表中依据经验选取的参数。变量名第一个单词表示对应的算法。

    private static final int BINARYSEARCH_THRESHOLD   = 5000;
    private static final int REVERSE_THRESHOLD        =   18;
    private static final int SHUFFLE_THRESHOLD        =    5;
    private static final int FILL_THRESHOLD           =   25;
    private static final int ROTATE_THRESHOLD         =  100;
    private static final int COPY_THRESHOLD           =   10;
    private static final int REPLACEALL_THRESHOLD     =   11;
    private static final int INDEXOFSUBLIST_THRESHOLD =   35;

静态方法

排序

排序算法方法体比较简单,根据形参是否带比较器,有两种实现。不带比较器的 sort 方法由 public static <T extends Comparable<? super T>> 修饰,是一个泛型定义的语法。先看内层,? super T 是Comparable接口的泛型参数,其中 ? super 是下界通配符,保证Comparable接口能够使用T或T的超类作为类型参数。因此 sort 方法的泛型类型 T 必须是实现了Comparable接口,并且Comparable接口的类型参数是T或者T的父类。