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

时间:2015-08-27 19:50:01

标签: java arrays refactoring

查看Dual pivot快速排序的jdk implementatino,每种类型的数组都有大量重复的代码。例如:

整数:

 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;
    }

多头:

alldata_filtered <- alldata[rowSums(!is.na(alldata[2:6])) > 0, ]

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

1 个答案:

答案 0 :(得分:5)

这是出于性能原因而完成的。通用T[]不能用于代替原始intlong s的数组,因此如果没有int[]long[]的重载,用户就会被迫使用使用盒装LongInteger s。

的泛型

你也无法从这里获得自动装箱,因为自动装箱是为单个基元定义的,而不是为基元数组定义的。

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:方法doSomething in class ...不能应用于给定的类型;

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

原因:推理变量T具有不兼容的边界      等式约束:int      上界:对象    其中T是一个类型变量:      T扩展方法doSomething(T [])

中声明的Object

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