[英]Initializing ArrayList with a new operator in Java?
在Java中初始化ArrayList
的最佳實踐是什么?
如果我使用new
運算符初始化ArrayList,那么默認情況下ArrayList將為10個桶分配內存。 這是一個性能打擊。
我不知道,也許我錯了,但在我看來,如果我確定尺寸,我應該通過提及尺寸創建一個ArrayList
!
這是一個性能打擊。
我不擔心“性能受損”。 Java中的對象創建非常快。 性能差異不太可能由您衡量。
如果您知道,請務必使用尺寸。 如果你不這樣做,無論如何都沒有什么可做的。
你在這里做的那種想法被稱為“過早優化”。 唐納德克努特說這是萬惡之源。
更好的方法是在快速完成代碼之前使代碼工作。 利用手中的數據進行優化,告訴您代碼的緩慢位置。 別猜 - 你可能錯了。 你會發現你很少知道瓶頸在哪里。
如果您知道要添加的元素數量,請使用正確數量的對象初始化ArrayList。 如果你不這樣做,不要擔心。 性能差異可能微不足道。
這是我能給你的最佳建議:
ArrayList
,但是使用new
,庫提供的默認選項,不是一個壞選擇,否則讓它成為每個人的默認選擇是愚蠢的,沒有說明什么更好。 LinkedList
或任何其他類型的List
。 設計這種靈活性。 Integer.valueOf
並不總是創建新實例)。 static
工廠方法(也在Guava中 ) ArrayList
微觀管理 如果您需要對ArrayList
進行微觀管理,以下是一些具體提示:
ArrayList(int initialCapacity)
來設置列表的初始容量。 如果需要,該列表將自動增長到超出此容量。 ArrayList
,並且您知道元素的總數時,您可以使用ensureCapacity(int minCapacity)
(或直接上面的構造函數)來減少中間增長的數量。 無論您是否執行此操作(如API中所保證的),每個add
都將以攤銷的常量時間運行,因此這只能通過常數因子降低成本。 trimToSize()
來最小化存儲使用情況。 這種微觀管理通常是不必要的,但如果您決定(通過確定的分析結果證明)值得麻煩,您可以選擇這樣做。
Collections.singletonList
- 返回僅包含指定對象的不可變列表。 如果您已經知道ArrayList的大小(大約),那么您應該使用具有容量的構造函數。 但是大多數時候開發人員並不真正知道列表中的內容,因此對於大多數情況來說,容量為10就足夠了。
10桶是一個近似值,不影響性能,除非你已經知道你的ArrayList包含噸的元素,在這種情況下,需要調整您的陣列中所有的時間將是對性能的影響。
您不需要告訴ArrayList的初始大小。 您可以隨時輕松添加/刪除任何元素。
如果這是性能問題,請記住以下事項:
如果您不知道ArrayList
的大小,那么您最好使用LinkedList
,因為LinkedList.add()
操作是恆定速度。
但是,正如大多數人所說,在進行某種分析之前,不要擔心速度。
您可以使用這個舊的,但很好(在我看來)的文章作為參考。 http://chaoticjava.com/posts/linkedlist-vs-arraylist/
由於ArrayList是由底層數組實現的,因此我們必須為數組選擇初始大小。
如果您真的在意,可以在構建並填充對象后調用trimToSize() 。 javadoc聲明容量至少與列表大小一樣大 。 如前所述,你不太可能會發現分配給ArrayList的內存是性能瓶頸,如果是,我建議你改用陣列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.