2013-12-11 55 views
2

衆所周知,自動裝箱可以是計算密集型的,但在我看來,允許原始數組自動裝箱到等價的排序方法是一個合適的邊緣情況,特別是當基於某些外部計算對值進行排序時。爲什麼在使用Arrays.sort()時自動裝箱不允許用於原始數組?

我之前有一個問題,需要根據基於索引值的計算結果對給定的原始數組int進行排序。但是,java.util.Comparator不允許任何實施類和compare(T x, T y)方法的原始類型。的

因此,而不是做一些像

public void sortRow(int row){ 
    Arrays.sort(this.buffer[row], new Comparator<Integer>(){ 
    @Override 
    public int compare(int x, int y){ 
     return (PhotoUtils.getBrightnessValue(x) <= PhotoUtils.getBrightnessValue(y) ? x : y; 
    } 
    } 
} 

我不得不實施第二步:

public void sortRow(int row){ 
    Integer[] tempArray = new Integer[this.buffer[row].length]; 

    for (int i = 0; i < tempArray.length; i++) 
    tempArray[i] = this.buffer[row][i]; 

    Arrays.sort(tempArray, new Comparator<Integer>(){ 
    @Override 
    public int compare(Integer x, Integer y){ 
     return (PhotoUtils.getBrightnessValue(x) <= PhotoUtils.getBrightnessValue(y) ? x : y; 
    } 
    } 
} 
+0

dup:http://stackoverflow.com/questions/4558081/why-i-cant-use-comparator-to-sort-primitives –

+1

Autoboxing數組將涉及到創建一個循環來複制數組元素。這比單個元素的相對簡單的邏輯複雜得多。此外,自動拆箱數組元素會有幾個不明確的複雜情況。對於排序情況,對於每種基本類型都有單獨的比較/排序例程更有意義。 –

+0

如果第三方庫是公平遊戲,使用[Guava](https://code.google.com/p/guava-libraries/),您可以執行Collections.sort(Ints.asList(int []),new比較器(){...})'。 –

回答

3

按照JLS, Section 5.1.7,只有在下列規定裝箱轉換和數組AREN」 t參與其中:

拳擊轉換轉換primi表達式tive類型爲 對應表達式的引用類型。具體來說, 以下九個轉換被稱爲裝箱轉換:

  • 從布爾型輸入布爾

  • 從類型字節輸入字節

  • 從類型短類型的短

  • 從字符型到字符型字符

  • 從int類型Integer類型

  • 從long類型爲long類型

  • 從float類型爲float類型

  • 從型雙輸入雙

  • 從null類型空類型

0

要自動裝箱單個值需要分配一個新的原始包裝對象。自動複製整個數組需要爲數組中的每個元素分配新的primitve包裝對象,並分配一個新的引用數組來保存對剛剛創建的新對象的引用。因此,對於由演員隱式地完成的事情而言,這將是很大的開銷。這意味着如果你有一個大小爲1024的類型爲byte[]的變量,那麼你將不得不分配一個4-8字節的引用數組。並分配1024個字節對象中的每一個以填充來自原始數組的值。因此除了最初添加到陣列的1024之外,您現在至少分配了5120-9216個字節的數據。

+0

比成本更糟的是'Byte []'和'byte []'是單獨的實體,並且沒有辦法確保對其中一個的更改總是會反映在另一箇中。 – supercat

1

我認爲這裏的問題更多的是Type參數只能是引用類型或通配符。From the JLS Section 4.5.1

類型參數可以是引用類型或通配符。

Arrays.sort(E, Comparator<? super E>)方法是其中變量E類型被綁定到用於陣列和Comparator兩者,即,類型參數的通用方法。他們必須是一樣的。基元不能與泛型一起使用,因此不能使用基元類型的數組。

爲什麼在使用 Arrays.sort()時不允許使用自動裝箱進行原始數組自動裝箱?

因此,Arrays.sort的問題不是自動裝箱,它是泛型的限制。

爲什麼自動裝箱不適用於原語,請參閱其他答案。基本上JLS不允許它。

+0

從OP的問題看來,他理解這一點。他實際上問的是爲什麼原始數組不被自動裝箱到他們的包裝類型數組中 –

+0

@aaron我會審查。 –

+0

@SotiriosDelimanolis,你的編輯點擊我的問題癥結。 – Jason

相關問題