Java - 为什么 DualPivotQuicksort 有重复的代码?

Java - Why does DualPivotQuicksort have duplicated code?

查看双枢轴快速排序的 jdk 实现,每种类型的数组都有大量重复代码。例如:

整数:

 static void sort(int[] a, int left, int right,
                 int[] work, int workBase, int workLen) {
    // Use Quicksort on small arrays
    if (right - left < QUICKSORT_THRESHOLD) {
        sort(a, left, right, true);
        return;
    }

多头:

 static void sort(long[] a, int left, int right,
                 long[] work, int workBase, int workLen) {
    // Use Quicksort on small arrays
    if (right - left < QUICKSORT_THRESHOLD) {
        sort(a, left, right, true);
        return;
    }

为什么不直接使用 T[] a 并从自动装箱中获益?

这是出于性能原因。通用 T[] 不能用于代替原始 ints 或 longs 的数组,因此如果没有 int[]long[] 的重载,用户将被迫使用使用盒装 Longs 和 Integers.

的泛型

您也无法从此处的自动装箱中受益,因为自动装箱是为单个基元定义的,而不是为基元数组定义的。

private static <T> void doSomething(T[] array){
    ...
}
public static void main (String[] args) throws java.lang.Exception {
    doSomething(new String[10]); // Compiles fine
    doSomething(new int[10]);    // Compile-time error
}

Main.java:...: error: method doSomething in class ... cannot be applied to given types;

  doSomething(new int[10]);
  ^
 required: T[]
 found: int[]

reason: inference variable T has incompatible bounds equality constraints: int upper bounds: Object where T is a type-variable: T extends Object declared in method doSomething(T[])

即使可以,处理速度也会慢很多,并且需要大量额外内存,因为包装大型基元数组的成本可能很高。

因为这会向所有可能的对象开放它,在这种情况下,您需要实施 compareTo 方法才能以某种方式对对象进行排序。

编译器保持简单。数字很​​好。

还有性能,使用对象需要比使用基本类型更多的内存。