2014-03-03 29 views
2

如何將原始數字存儲在Java列表中?當我嘗試做Java列表中的數字

List<double> list = new ArrayList<>(); 

編譯器告訴我,double不是一個對象。看來這些收藏品不是爲原始作品製作的。我笨拙的解決方法如下:

List<Double> list = new ArrayList<>(); 

但這是慢,使用更多的內存。有一個更好的方法嗎?

+0

這是正確的方法。 – Christian

+0

不,這是唯一的方法。 – Bart

+0

使用'double []'?如果你想動態增加數組,那麼在標準Java中你將不會有其他選擇。順便說一句,你爲什麼認爲這很慢。你有一些基準來證明這一點嗎? –

回答

2

您不能直接在Java中的集合中使用基元。這是一個有意的Java設計決定(儘管有些人認爲這是一個錯誤)。事實之後,Java中的泛型被狂奔,這就是爲什麼他們的應用程序在整個語言中不統一的原因。

容器基本上需要對象類型和原始類型不是從Object派生的(即,Object不是它們的超類,不像Java中的每個其他對象)。從一個代碼編寫點,它肯定看起來像有沒有包裝:

list.add(6); //list is of type List<Integer> 
int num = list.get(i); 

這是因爲裝箱和拆箱會自動爲你完成。在字節碼級別,你實際上擁有的是:

list.add(new Integer(6)); 
int num = ((Integer) list.get(i)).intValue(); 

所以你有的第二個選擇是在Java中的正確方法。

如果您想要一個較少內存的選項,您可以選擇直接double[]。但是,這意味着您將不得不編寫代碼來管理添加,檢索,更新和刪除操作。如果這太多額外的工作,你可以嘗試使用Apache Commons Primitives

此外,我懷疑你的意思List<Double> list = new ArrayList<>();(或其他一些實施),對不對?這是因爲你有什麼不會編譯。

0

不,沒有更好的辦法。 Collection的實例只能保存在對象上,而不是基元。所以你的解決方法是要走的路。

除非您正在編寫一個時間關鍵組件,否則在這種情況下關於內存使用情況和/或性能的問題可能表明您是過早優化的先兆。

-2

您可以使用一個集合。雙是不是一個對象,但它是雙。

+0

這根本不回答問題。 – Dukeling

0

您不能對基元使用集合。您只能將對象存儲在集合中。這些對象將自動取消裝箱。

這是唯一可行的方法。

您可以從以下鏈接獲得更多信息:http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

+0

@Downvoter:你能解釋一下downvoting的原因嗎? –

+0

您的回答只解決部分問題。你沒有解決性能問題,爲什麼自動裝箱技術是或者不是可以接受的性能。在我看來,這樣一個「容易」的問題值得全面的回答。 –

0

有沒有更好的辦法。至少Java提供了automatic conversions之間的回退和轉發。雙倍和雙倍,使這不那麼痛苦('autoboxing'/'autounboxing',因爲它是已知的)