查看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并从自动装箱中受益?
答案 0 :(得分:5)
这是出于性能原因而完成的。通用T[]
不能用于代替原始int
或long
s的数组,因此如果没有int[]
或long[]
的重载,用户就会被迫使用使用盒装Long
和Integer
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
即使你可以,处理速度也会慢很多,并且需要大量额外的内存,因为包装大型基元数组可能会很昂贵。