簡體   English   中英

需要將大型“ int”類型的數組傳遞給通用數組和集合

[英]Large array of 'int' type needs to be passed to a generic array & collections

我正在從函數生成一個具有int類型的元素的大型數組(大小> 1000)。 我需要將此數組傳遞給泛型類型數組,但是由於泛型類型數組不接受原始類型的數組,因此我無法這樣做。

我擔心使用Integer類型的數組,因為這樣做對於大型數組而言,在創建,性能,所使用的空間(12個字節對​​象的數組)方面會非常昂貴。 當我需要對數組元素執行一些加法運算時,還會創建不可變的Integer

最好的搭配方式是什么?

編輯只是為了消除周圍的一些混亂,我需要將int []傳遞給簽名類型的方法: void setKeys(K... keys)

如果您的陣列數量在1000(甚至10,000或100,000)個元素的數量級上,那么除非您對每個陣列進行數千次處理,否則在內存和性能方面的成本差異可能不會很明顯。 使用Integer編寫代碼,並在以后遇到性能問題時進行優化。

我想將int[]傳遞給此函數: public Query<K> setKeys(K... keys);

我假設您的意思是int[]應該是鍵的集合,而不僅僅是一個鍵。

那是不可能的。 泛型類型的類型參數必須是引用類型。 您的用例要求Kint

您有兩種選擇:

  • 使用Integer (或可變的int持有者類)並支付性能罰款,或者
  • 放棄使用泛型並更改該方法的簽名。

順便說一下, Integer類為較小的int值保留了Integer對象的緩存。 如果使用Integer.valueOf(int)創建對象,則很有可能會獲得對預先存在的對象的引用。 (當然,這僅適用於Integer對象是不可變的。)

如果你關心性能你可以寫一個簡單的類,包裝了一個公共int ,因此這意味着你可以讓你的電話,仍然需要發生變異它。 話雖如此,我確實同意您要絕對確保在進行此性能改進之前需要這樣做。

如果其實不必擔心裝箱/拆箱整數性能影響,您可以考慮GNU特羅韋 ,特別是他們TIntArrayList 它使您可以在被原語支持的同時模仿ArrayList<Integer>的功能。 就是說,我不確定您是否需要這個,也不確定這正是您所要的。

如果您不希望將整數永久裝箱,則可以從Google Collections庫( http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/comInts.asList()的結果/google/common/primitives/Ints.html#asList(int ...) ),它是數組支持的List<Integer> 這些值將在被訪問時被裝箱,因此,僅當未多次訪問這些值時,這才有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM