2013-08-04 35 views
2

說我有一個字符串列表或任何真的。然後說我想在下一位代碼中多次使用字符串ONE。我是否應該在下面的代碼中創建一個新的字符串變量foo String foo = list.get(position)並使用foo,或者每次需要使用該字符串時是否應該保存內存空間並使用list.get(position)?或者他們實際上是同一件事情?在Java中爲Android更快更高效

如果列表中包含一個更復雜的類,它可能會執行大量計算來實例化或者本身有很多變量,因此創建一個新的佔用大量內存,答案會改變嗎?

回答

7

該列表只保存對其包含的項目的引用,而不包含項目本身。

當您編寫SomeObject s = list.get(0);時,您只需檢索對象的引用,使用的內存爲32位或64位,具體取決於設備。而且由於get操作非常快(本質上是一個數組訪問),答案是它幾乎沒有區別*(但是使用一個變量可能會稍微快一點)。

從可讀性的角度來看,通常最好使用一個額外的變量並給它一個不言自明的名字。

*假設您使用ArrayList:對於其他列表實現,get的成本可能很大。

+0

我同意,從可讀性角度看,它是使用一箇中間變量比較方便,但是當你使用額外的變量,你在堆上分配一個額外的對象 - 一個額外的字符串 –

+3

不,你不會 - 因爲解釋在我的回答中,一個變量是一個對象而不是對象本身的引用(=指針)。在'String s =「ABC」; String s2 = s;'只有一個字符串對象,但有兩個引用。 – assylias

+0

是的,對不起,你說的對,早上混亂 –

4

獲取值一次,並保持你的用例的生命:

  1. 存儲成本舉辦一提的是最小,並低於成本,在字節N多調用list.get(0)對於一些小的(可能是2,如果不是1)。當然,成本可能在不同的內存區域。

  2. 運行成本list.get(0)不應該被認爲是非常快的(O(1))。這種假設是基於一個潛在的ArrayList;它是O(N)LinkedList

  3. 如果你的代碼做,或曾經會,在多線程環境中運行,那麼:

    • list可以在幕後改變。

    • (受保護的)get的成本將上升。

  4. 正如assylias提到的,給這個值賦予一個有意義的名字會更好。

+0

+1爲您的非常全面的答案! – assylias

相關問題