2011-07-03 22 views
3

我正在構建一個Android應用程序(所以機器資源有限),我想知道我應該如何挑剔LinkedLists。Java性能和內存:LinkedList和數組

我知道數組是最輕的容器,並且是隨機訪問最好的容器,所以如果只考慮性能,它們顯然是理想的選擇。然而,當你不知道你的名單會有多大時,他們的僵化是一種痛苦。

因此,這裏是我的問題:是否值得系統地使用以下類型的機制中誰具有不可預知的尺寸的一個或多個列表類:

public class unpredictable 
public Object[]realArray; 
private LinkedList<Object> temp; 

//what using classes will call to add items 
public void add(Object item) 
{ 
    temp.add(item); 
} 

//what the outer class calls when it knows there's nothing left to add 
public void doneAdding() 
{ 
    realArray = new Object[tmp.size()]; 
    transferAndRecycle(); 
} 

private void transferAndRecycle() 
{ 
    // copy items from linkedlist to array 
} 

所以我想我問它是否值得它需要額外的步驟來擺脫Java的LinkedList對象所需的額外空間?

任何輸入?謝謝

+0

它過早優化的氣味。 – Robin

回答

8

我想你提供了很多ArrayList類已經包含的服務。 ArrayList爲您提供了O(1)元素訪問;有一個鏈表是O(n)。 ArrayList的基本機制是一個數組。您可以通過操縱容量來控制此數組的大小。

仔細觀察ArrayList - 你可以避免重新發明一些輪子。

另外的想法:數組和泛型不能很好地播放。 ArrayLists可以。這是一件小事,但可能對你很重要。

+0

謝謝!在過去的兩個學期裏,我的教授們深深地打入了我們的大腦,當我今年夏天回到爪哇時,我甚至沒有考慮過其他任何事情。 – soBinary

1

除了什麼ncmathsadist已經說過:

你的選擇也應取決於其操作情況經常發生:添加/刪除內容或直接訪問一個元素。如果它是前者,則使用LinkedList。如果是後者,則使用ArrayList。不要忘記:在調整數組的大小時(不管是你自己的解決方案還是Java的ArrayList),都有一個時間點分配兩次內存:一次是「舊的」,一次是「新的數組」 「在調整操作完成之前。

因此,如果記憶真的是你關心的事情,你應該考慮一下。

1

ArrayList比LinkedList具有更好的引用位置和更少的內存引用。一般情況下除非你需要一個特定的LinkedList特性(在中間快速刪除,拼接等)更喜歡ArrayList

0

如果你看看Java Docs,你可以找到該類提供的方法,這些方法已經具有你想要的功能喜歡你的問題。例如,這是一個將數組列表轉換爲數組的函數。

http://download.oracle.com/javase/1.5.0/docs/api/


T [] 指定者(T []一個) 返回包含在該列表中以正確的順序的所有元素的陣列;返回數組的運行時類型是指定數組的運行時類型。

+0

我知道如何將集合轉換爲數組...再次閱讀我的問題,你誤解了它。 – soBinary