2011-05-25 33 views
5

我經常在我的Android應用程序中使用列表。現在我正在創建一個Twitter頁面,其中列出了最多50個用戶的「推文」。在Java中聲明列表的容量

我有這樣定義的表:

List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);

Tweet是自定義對象類型保持微博更新信息(文本,日期,用戶名等),MAX_TWEETS是常數整數值(50 )。

問題:

什麼是設置此List的初始容量,如果任何的好處?

當我知道我的清單會是這麼小時,我是否應該打擾設置容量?我應該何時/不應該設置容量?

回答

2

ArrayList的默認容量設置爲10(請參閱jdk 1.6源代碼)。這意味着大小爲10的數組將在創建時分配。如果要添加元素編號11,則容量將增加到16.然後在達到21時再次增加。

如果您不希望超過50個元素,則陣列最多可以調整3次。鑑於這個小數目,它確實沒有多大關係。如果它給你一個在陣列副本上保存的想法,將它設置爲50。

其實這是大型化的正確的公式:

int newCapacity = (oldCapacity * 3)/2 + 1; 
2

設置此列表的初始容量有什麼好處?

它會在內部分配這個大小的內存,當它增長到它將重新分配內存並且會。如果我們提供適當的初始容量,我們可以保存一些cpu週期,同時重新調整溢出。

2

設置列表的大小隻會指定它的大小。這樣做的唯一好處是,當你添加超出列表默認大小的項目時,它不必擴展列表。

例如:您將列表設置爲25,默認值爲10? (不是100%肯定),如果你添加24個元素,它根本不需要增加列表。如果你把它作爲默認值,它會增長它。

希望這有助於

3

設置初始容量填充列表時,可以提高性能,而且還可以降低列表的內存佔用,如果你從不添加高於數量的項目到列表中的多。

已經成長列表的內存佔用量,並可能有一個支持數組是通過調用trimToSize()

2

初始容量幫助,如果你知道你將需要比存儲可以減少項目的數量較大確切的數額。它將創建一個容器,可以參考MAX_TWEETS項目。如果超過它,系統會創建一個新列表,其中包含兩倍的項目,然後複製原始列表(這在Java應用程序中已足夠常見)。

3

默認情況下,在Java 6中,List的大小爲10.也就是說,系統會在基礎數組中創建10個內存插槽。如果您嘗試添加第11個元素,則僅創建陣列副本。提供大小可以提高性能。

2

顧名思義,ArrayList被實現爲一個數組(而不是鏈表)。通過指定初始大小,可以防止在添加元素時增大數組的大小。這是一個昂貴的操作,必須創建一個新的數組,然後複製現有的元素。所以,如果你提前知道最大值,你不應該這樣做。

實際上,如果列表的大小是50,並且只有一個這個數組的實例,那麼該數組只會被擴展幾次,所以在這種情況下可能並不重要。儘管如此,如果您稍後再更改變量,那麼您的方法很好。

2

將分配在創建的內存,不會有複製,直到你去了這一點。

但說實話,只有50個物體,複製不會花費太多精力,所以我非常懷疑你會看到任何性能增益。但是,指定尺寸沒有缺點,所以你不妨做。