最近重温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的父类。