[英]Using Small (1-10 Items) Instance-Level Collections in Java
在用Java創建類時,我經常發現自己創建的實例級集合我提前知道的非常小 - 集合中少於10個項目。 但我不知道提前的項目數量,所以我通常會選擇動態集合(ArrayList,Vector等)。
class Foo
{
ArrayList<Bar> bars = new ArrayList<Bar>(10);
}
我的一部分一直在嘮叨我,使用復雜的動態集合來處理這么小的東西是浪費的。 有沒有更好的方法來實現這樣的事情? 或者這是常態嗎?
請注意,我沒有遇到任何(明顯的)性能損失或類似的事情。 這只是我想知道是否有更好的方法來做事。
Java中的ArrayList
類只有兩個數據成員,一個對Object[]
數組的引用和一個大小 - 如果你不使用ArrayList
,你需要它。 因此,不使用ArrayList
的唯一好處是保存一個對象分配,這不太可能是一個大問題。
如果你每秒都在創建和處理容器類的許多實例(以及擴展你的ArrayList
實例),那么垃圾收集流失可能會有一些問題 - 但是如果它發生的話就要擔心。 垃圾收集通常是您最不擔心的問題。
為了簡單起見,我認為這幾乎不是問題。 您的實現足夠靈活,如果將來需求發生變化,您不會被迫進行重構。 此外,為混合解決方案添加更多邏輯代碼並不值得考慮您的小數據集和高質量的Java Collection API。
Google Collections具有針對不可變/少量元素進行優化的集合。 請參閱Lists.asList
API作為示例。
開銷非常小。 可以編寫一個混合數組列表,其中包含前幾個項的字段,然后回退到使用數組表示更長的列表。
您可以通過使用數組完全避免列表對象的開銷。 為了進一步硬核,您可以將該字段聲明為Object,並為單個項目完全避免使用該數組。
如果內存確實存在問題,您可能想要忘記在低級別使用對象實例。 而是以更大的粒度級別使用更大的數據結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.