2013-05-30 69 views
0

如果我有一個Java對象的ArrayList,底層實現是否僅僅是一個對象引用的數組?我創建了這個方法:arrayList大小的區別

//method returns all combinations of Objects 
public ArrayList<ArrayList<Object>> getAllCombinations(ArrayList<Object> allObjects){ 

} 

當我開始思考這個問題,我想知道如果我可以只返回一個ArrayList<ArrayList<Integer>>其中整數均allObjects位置(主要是認爲這將極大地使用較少的內存)。但是後來我開始認爲數組實現的每個值都指向了數組中的對象的內存位置,並且數組並沒有爲我創建的每個ArrayList創建新的對象(這肯定會使用更多的內存)。所以實際上,如果我實現上面提到的方法,它會使用大致相同的內存,對嗎?

我想我需要了解Java的內存分配更好一點......

回答

1

是,數組或一個ArrayList只包含的對象,而不是對象本身的引用。因此,無論基礎對象的大小如何,陣列中的每個項目都會使用4個字節的內存(在32位計算機上)。

所以保持簡單並返回任何有意義的東西。

+0

雖然我明白你的觀點,但至少有點似是而非的保持,每個元素只使用4個字節。雖然確實參考值只有那麼大,但這忽略了這樣一個事實,即必須從堆中爲每個對象分配空間。 – scottb

+0

@scottb很明顯 - 操作者似乎擔心把對象放置在數組列表中會使其大小增加一倍。我試圖解釋一下,即使是一個大型對象,在列表中添加4個字節的「內存使用量」。 (這是一個簡化,因爲底層數組在每次添加時不會調整大小) – assylias

+0

@scottb您能解釋一下您對每個對象的堆分配的含義嗎? – sunrize920

1

你明白了:你的ArrayList的元素將只有對象(除非你明確地複製它們)。所以這兩個實現將使用與您說的相同的內存。

這是順便提一下重要的一點,如果你想改變你的對象的狀態,因爲它們在它們的原始數組中也會被改變。