我想清楚一些事情: 當使用數組列表時,它以10個元素的大小開始。如果需要自動增加,它會將整個arrayList重寫爲2/3以上。ArrayList效率和大小
如果我期待在名單最終將尺寸50-120,是它更好地:
- 創建尺寸150馬上並有大量未使用的空間
- 允許列表自動增加幾次?
感謝
我想清楚一些事情: 當使用數組列表時,它以10個元素的大小開始。如果需要自動增加,它會將整個arrayList重寫爲2/3以上。ArrayList效率和大小
如果我期待在名單最終將尺寸50-120,是它更好地:
感謝
如果你知道ArrayList
的可能最終大小,它通常是最好的前期指定:
ArrayList myList = new ArrayList(150);
這可以節省您不必ArrayList
重新分配對性能的影響用於存儲其內容的數組(儘管對於您指定的數組大小,這種影響可以忽略不計)。
但是可能的最終尺寸*在這裏並不真正知道。例如,考慮90%的案例只需要50個元素,只有5%需要120個。 – 2011-06-07 15:17:46
是的,但沒有實際數據的優化總是猜測,這就是爲什麼通常不推薦。 – 2011-06-08 07:39:24
它重寫整個ArrayList的是2/3時
號它使得陣列兩次一樣大(雖然確切的因子是一個未記錄的實現細節)。我站好了。
如果我期待在名單最終將尺寸50-120,最好是:1.創建尺寸150馬上
爲什麼150?爲什麼不是120?
- 允許列表自動增加幾次?
在很小的範圍內,我會用大尺寸的時候了。如果跨度更大(例如50-50000),我會保留最小的大小(或者中間大小,取決於期望的值分佈)並讓它調整幾次。
如果您大致瞭解最終尺寸,那麼以該尺寸創建它會更有效。但是對於150的列表大小,這看起來像是一個微型優化。
只要您不打算創建數以百萬計的這些列表,實際上並不重要。複製陣列數據速度非常快,增加大小以達到50-120個項目將無法通過分析器進行測量。但是,如果您知道該列表最終會具有此大小,建議在創建列表時使用此信息。
是的,由於自動調整大小,預先指定大小更好。 ArrayList
得到越大它必須調整自己。
它的計算量非常小,只需要儘可能的大,但事實上Java非常高效,因此不必擔心arraylist是如何增加的。但是,如果您要獲得最大效率,那麼是的,在創建列表時分配內存效果會更好。
你也可以使用Guava的漂亮方法Lists.newArrayListWithExpectedSize。
這裏是
創建一個ArrayList實例尺寸適當地保持的估計數量的元件不調整的Javadoc。如果估計值較低,則會添加少量填充。
除非您對代碼進行了概要分析,這確實是一個瓶頸,我不會在意指定初始大小。這些數字太小了。 – gpeche 2011-06-07 15:25:58