2011-06-07 59 views
8

我想清楚一些事情: 當使用數組列表時,它以10個元素的大小開始。如果需要自動增加,它會將整個arrayList重寫爲2/3以上。ArrayList效率和大小

如果我期待在名單最終將尺寸50-120,是它更好地:

  1. 創建尺寸150馬上並有大量未使用的空間
  2. 允許列表自動增加幾次?

感謝

+2

除非您對代碼進行了概要分析,這確實是一個瓶頸,我不會在意指定初始大小。這些數字太小了。 – gpeche 2011-06-07 15:25:58

回答

10

如果你知道ArrayList的可能最終大小,它通常是最好的前期指定:

ArrayList myList = new ArrayList(150); 

這可以節省您不必ArrayList重新分配對性能的影響用於存儲其內容的數組(儘管對於您指定的數組大小,這種影響可以忽略不計)。

+0

但是可能的最終尺寸*在這裏並不真正知道。例如,考慮90%的案例只需要50個元素,只有5%需要120個。 – 2011-06-07 15:17:46

+0

是的,但沒有實際數據的優化總是猜測,這就是爲什麼通常不推薦。 – 2011-06-08 07:39:24

1

它重寫整個ArrayList的是2/3時

號它使得陣列兩次一樣大(雖然確切的因子是一個未記錄的實現細節)。我站好了。

如果我期待在名單最終將尺寸50-120,最好是:1.創建尺寸150馬上

爲什麼150?爲什麼不是120?

  1. 允許列表自動增加幾次?

在很小的範圍內,我會用大尺寸的時候了。如果跨度更大(例如50-50000),我會保留最小的大小(或者中間大小,取決於期望的值分佈)並讓它調整幾次。

+1

你確定你的第一點? (我沒有方便的來源) – jjnguy 2011-06-07 15:12:42

+0

@jjnguy沒有指定,但這是典型的實現。 - **編輯**我錯了。 – 2011-06-07 15:14:49

+0

*增長策略的細節並未超出添加元素具有不變攤銷時間成本的事實。* - 1.6 API – alexcoco 2011-06-07 15:16:06

1

如果您大致瞭解最終尺寸,那麼以該尺寸創建它會更有效。但是對於150的列表大小,這看起來像是一個微型優化。

1

只要您不打算創建數以百萬計的這些列表,實際上並不重要。複製陣列數據速度非常快,增加大小以達到50-120個項目將無法通過分析器進行測量。但是,如果您知道該列表最終會具有此大小,建議在創建列表時使用此信息。

2

是的,由於自動調整大小,預先指定大小更好。 ArrayList得到越大它必須調整自己。

4

它的計算量非常小,只需要儘可能的大,但事實上Java非常高效,因此不必擔心arraylist是如何增加的。但是,如果您要獲得最大效率,那麼是的,在創建列表時分配內存效果會更好。

1

你也可以使用Guava的漂亮方法Lists.newArrayListWithExpectedSize

這裏是

創建一個ArrayList實例尺寸適當地保持的估計數量的元件不調整的Javadoc。如果估計值較低,則會添加少量填充。