2008-09-11 60 views
6

在Java中創建類時,我經常發現自己創建的實例級集合提前知道的數量非常少 - 集合中只有不到10個項目。但是我不知道事件的數量,所以我通常會選擇一個動態集合(ArrayList,Vector等)。在Java中使用小型(1-10項)實例級集合

class Foo 
{ 
    ArrayList<Bar> bars = new ArrayList<Bar>(10); 
} 

我的一部分一直嘮叨我,它的浪費使用複雜的動態集合中大小事這個小。有沒有更好的方式來實現這樣的事情?或者這是常態?

請注意,我沒有遇到任何(顯着的)性能處罰或類似的情況。這只是我想知道是否沒有更好的方式來做事情。

回答

11

Java中的ArrayList類只有兩個數據成員,對Object[]數組和一個大小的引用 - 如果不使用ArrayList,則無論如何您都需要這個引用。因此,不使用ArrayList的唯一好處是節省一個對象分配,這不太可能是件大事。

如果您正在創建和你的容器類的很多,很多情況下的處置(通過擴展您的ArrayList實例)每一秒,你威力有垃圾收集一個小問題,客戶流失,但是這是值得憂慮如果它曾經發生過。垃圾收集通常是您最擔心的問題。

1

開銷很小。可以編寫一個混合數組列表,其中包含前幾個項目的字段,然後回退到使用數組獲取更長列表。

通過使用數組可以完全避免列表對象的開銷。要進一步硬派,你可以聲明這個字段爲Object,並且避免單個項目的數組。

如果內存確實是一個問題,那麼您可能會忘記在底層使用對象實例。相反,要在更大的粒度級別上使用更大的數據結構。

+0

你說的沒有錯,本身,但我不想做任何這些事情。以某種方式動態地在object - > array - > ArrayList之間進行復雜性的複雜性非常好,而且創建一個簡單ArrayList的代價非常小,我認爲這只是一個不好的建議 – 2008-09-11 17:53:26

+0

這很少重要,但是當它很重要時它是可以修復的。例如,javac確實很奇怪,爲的是讓字符串的內存很小,所以我們都可以從更快,更小的編譯中受益。 – 2008-10-04 17:51:04

3

爲了保持簡單,我認爲這幾乎不是問題。您的實現非常靈活,如果未來需求發生變化,您不會被迫重構。此外,爲混合解決方案添加更多邏輯代碼只是不值得考慮您的小數據集和Java Collection API的高質量。