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[]
不能用于代替原始 int
s 或 long
s 的数组,因此如果没有 int[]
或 long[]
的重载,用户将被迫使用使用盒装 Long
s 和 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: 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 方法才能以某种方式对对象进行排序。
编译器保持简单。数字很好。
还有性能,使用对象需要比使用基本类型更多的内存。
查看双枢轴快速排序的 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[]
不能用于代替原始 int
s 或 long
s 的数组,因此如果没有 int[]
或 long[]
的重载,用户将被迫使用使用盒装 Long
s 和 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: 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 方法才能以某种方式对对象进行排序。
编译器保持简单。数字很好。
还有性能,使用对象需要比使用基本类型更多的内存。