2015-08-27 32 views
3

看看Dual pivot快速排序的jdk實現,每種類型的數組都有大量的重複代碼。例如:Java - 爲什麼DualPivotQuicksort有重複的代碼?

整數:

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 []和自動裝箱,從受益?

+1

什麼自動裝箱?嘗試將一個'int []'傳遞給'Integer []' - 它們不是賦值兼容的。 – RealSkeptic

+0

自動裝箱正是爲什麼沒有完成。泛型類型必須是引用類型,這意味着你不得不使用'Long'而不是更便宜的'long',因爲數組並不是協變的。或者它是變體?我總是混合這些。無論哪種方式,「Long []」都不能轉換爲「long []」。 –

+0

我沒有注意到那種情況下不能使用汽車裝箱。值類型的出現如何允許對所有值類型使用一個泛型函數? http://cr.openjdk.java.net/~jrose/values/values-0.html – Diaa

回答

5

這是出於性能原因而完成的。通用T[]不能代替原始int S或long秒的陣列的使用,所以沒有與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[])

即使你能,加工將是慢了很多,這將需要大量的額外內存,因爲包裹元的大型陣列可能是昂貴的。

0

因爲這會將其打開到所有可能的對象,在這種情況下,您需要實現compareTo方法以便能夠以某種方式對對象進行排序。

編譯器保持簡單。數字很​​好。

性能以及與對象一起工作需要更多內存來處理基本類型。