簡體   English   中英

ArrayList.TrimToSize()和Array之間的區別?

[英]Difference between ArrayList.TrimToSize() and Array?

通常,他們說我們出於以下原因從Array移到ArrayList

數組是固定大小的,而數組列表則不是。

ArrayList的缺點之一是:

當達到其容量時,ArrayList變為其實際大小的3/2。 結果,如果我們沒有正確利用空間,內存可能會浪費掉。在這種情況下,首選數組。

如果我們使用ArrayList.TrimSize(),將使Array List成為一個一致的選擇嗎? 消除唯一的優勢(固定大小)陣列比它有優勢嗎?

一個簡短的答案是:trimToSize不能解決所有問題,因為在數組增長之后縮小數組-不同於首先阻止增長; 前者的成本是復制+垃圾回收。

更長的答案是:int []是低級的,ArrayList是高級別的,這意味着它更方便,但對細節的控制較少。 因此,在面向業務的代碼中(例如,操作“產品”的簡短列表),我將更喜歡ArrayList,這樣我就可以忽略技術性並專注於業務。 在面向數學的代碼中,我可能會選擇int []。

還有其他細微的差異,但我不確定它們與您的相關性如何。 例如,並發性:如果您同時從多個線程更改ArrayList的數據,則將有意失敗,因為這是大多數業務代碼的直觀要求。 一個int []將允許您做任何您想做的事情,由您自己來確定是否有意義。 同樣,這些都可以概括為“低級” ...

如果您正在開發對內存至關重要的應用程序,則還需要可調整大小,並且可以權衡性能,那么修剪數組列表是您的最佳選擇。 這是唯一一次帶有修剪的數組列表的一致選擇。

在其他情況下,您實際正在執行的操作是:

  1. 您已經創建了一個數組列表。 列表的默認容量為10。
  2. 添加了元素並應用了修剪操作。 因此,大小和容量現在都是1.修剪尺寸如何工作? 它基本上會創建一個具有列表實際大小的新數組,並將舊的數組數據復制到新的數組。 舊陣列留作抓斗收集。
  3. 您再次添加了一個新元素。 由於列表已滿,將重新分配50%的空間。 同樣,將遵循類似於2的過程。
  4. 再次調用TrimSize,它遵循與2相同的過程。
  5. 事情重復了...

因此,您會發現,為了保持列表容量和大小不變,我們會承擔很多性能開銷。 固定大小在這里沒有提供任何優勢,只是節省了很少的額外空間,這在現代機器中幾乎不是問題。

簡而言之,如果您希望在不編寫大量樣板代碼的情況下實現可調整性,那么數組列表是一致的選擇。 但是,如果大小從不改變,並且您不需要任何動態功能(例如刪除操作),那么數組是更好的選擇。 很少有額外的字節幾乎不是問題。

暫無
暫無

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

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