簡體   English   中英

用Java中的new運算符初始化ArrayList?

[英]Initializing ArrayList with a new operator in Java?

在Java中初始化ArrayList的最佳實踐是什么?

如果我使用new運算符初始化ArrayList,那么默認情況下ArrayList將為10個桶分配內存。 這是一個性能打擊。

我不知道,也許我錯了,但在我看來,如果我確定尺寸,我應該通過提及尺寸創建一個ArrayList

這是一個性能打擊。

我不擔心“性能受損”。 Java中的對象創建非常快。 性能差異不太可能由您衡量。

如果您知道,請務必使用尺寸。 如果你不這樣做,無論如何都沒有什么可做的。

你在這里做的那種想法被稱為“過早優化”。 唐納德克努特說這是萬惡之源。

更好的方法是在快速完成代碼之前使代碼工作。 利用手中的數據進行優化,告訴您代碼的緩慢位置。 別猜 - 你可能錯了。 你會發現你很少知道瓶頸在哪里。

如果您知道要添加的元素數量,請使用正確數量的對象初始化ArrayList。 如果你不這樣做,不要擔心。 性能差異可能微不足道。

這是我能給你的最佳建議:

  • 別擔心。 是的,你有幾個選項可以創建一個ArrayList ,但是使用new ,庫提供的默認選項,不是一個選擇,否則讓它成為每個人的默認選擇是愚蠢的,沒有說明什么更好。
  • 如果事實證明這是一個問題,您可以在分析時快速發現它。 當您分析應用程序的性能/內存問題時,這是找到問題的適當位置。 當你第一次編寫代碼時,你不必擔心這些東西 - 這是不成熟的優化 - 你只是擔心編寫好的,干凈的代碼,並且設計良好。
  • 如果你的設計很好,你應該能夠立即解決這個問題,對系統的其他部分影響不大。 Effective Java 2nd Edition,Item 52:通過接口引用對象 如果結果是更好的數據結構,您甚至可以切換到LinkedList或任何其他類型的List 設計這種靈活性。
  • 最后, Effective Java 2nd Edition,第1項:考慮靜態工廠方法而不是構造函數 您甚至可以將其與第5項相結合:避免創建不必要的對象 ,如果實際上實際上不需要新實例 (例如, Integer.valueOf並不總是創建新實例)。

相關問題


關於ArrayList微觀管理

如果您需要對ArrayList進行微觀管理,以下是一些具體提示:

  • 您可以使用ArrayList(int initialCapacity)來設置列表的初始容量。 如果需要,該列表將自動增長到超出此容量。
  • 當您即將填充/添加到ArrayList ,並且您知道元素的總數時,您可以使用ensureCapacity(int minCapacity) (或直接上面的構造函數)來減少中間增長的數量。 無論您是否執行此操作(如API中所保證的),每個add都將以攤銷的常量時間運行,因此這只能通過常數因子降低成本。
  • 您可以使用trimToSize()來最小化存儲使用情況。

這種微觀管理通常是不必要的,但如果您決定(通過確定的分析結果證明)值得麻煩,您可以選擇這樣做。

也可以看看

如果您已經知道ArrayList的大小(大約),那么您應該使用具有容量的構造函數。 但是大多數時候開發人員並不真正知道列表中的內容,因此對於大多數情況來說,容量為10就足夠了。

10桶是一個近似值,不影響性能,除非你已經知道你的ArrayList包含噸的元素,在這種情況下,需要調整您的陣列中所有的時間將是對性能的影響。

您不需要告訴ArrayList的初始大小。 您可以隨時輕松添加/刪除任何元素。

如果這是性能問題,請記住以下事項:

  1. ArrayList的初始化非常快。 別擔心。
  2. 從ArrayList添加/刪除元素也非常快。 別擔心。
  3. 如果您發現代碼運行速度太慢。 第一個責備是你的算法,沒有冒犯。 機器規格,操作系統和語言確實也參與其中。 但與算法參與相比,他們的參與被認為是微不足道的。

如果您不知道ArrayList的大小,那么您最好使用LinkedList ,因為LinkedList.add()操作是恆定速度。

但是,正如大多數人所說,在進行某種分析之前,不要擔心速度。

您可以使用這個舊的,但很好(在我看來)的文章作為參考。 http://chaoticjava.com/posts/linkedlist-vs-arraylist/

由於ArrayList是由底層數組實現的,因此我們必須為數組選擇初始大小。

如果您真的在意,可以在構建並填充對象后調用trimToSize() javadoc聲明容量至少與列表大小一樣大 如前所述,你不太可能會發現分配給ArrayList的內存是性能瓶頸,如果是,我建議你改用陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM