[英]Advantages of creating an ArrayList with initial capacity of 0?
我是一位經驗豐富的Java開發人員,並且不斷看到類似這樣的內容
List<Integer> l = new ArrayList<Integer>(0);
我真的不明白。 當您知道初始容量為0的ArrayList
會超出容量時,這有什么意義呢?
這樣做有什么好處嗎?
它使ArrayList
的大小(在內存中)保持很小,這是一種策略,適用於希望變量為非null並可以使用的情況,但又不希望 List
立即被填充。 如果您希望立即填充它,那么最好給它一個更大的初始值ArrayList
任何“增長”都是在內部創建一個新的原始數組,並將其復制過來。 ArrayList
增長非常昂貴,應將其最小化。
或者,如果要創建一個類的很多實例,每個實例都包含這些List
屬性之一。 如果您不立即計划填充它們,則可以通過暫時不分配空間來節省一些內存。
但是:有更好的方法: Collections.emptyList()
。 通常,您將希望直接保護對該列表的訪問,並且(例如)在您的類中提供對內部List
進行操作的特定於域的方法調用。 例如,假設您有一個包含學生姓名List
的School
班。 (保持簡單,請注意該類不是線程安全的。 )
public class School {
private List<String> studentNames = Collections.emptyList();
public void addStudentName(String name) {
if (studentNames.isEmpty()) {
studentNames = new ArrayList<String>();
}
studentNames.add(name);
}
public void removeStudentName(String name) {
studentNames.remove(name);
if (studentNames.isEmpty()) {
studentNames = Collections.emptyList(); // GC will deallocate the old List
}
}
}
如果您願意進行isEmpty()
檢查並執行初始化/分配,則這是創建大量空ArrayList
實例的更好選擇,因為Collections.emptyList()
是靜態實例(僅存在一個),而不是可修改的。
對於Java 6 (或openjdk 7),不指定初始大小會給您一個初始大小設置為10的列表。 因此,取決於您使用列表的許多因素,初始化大小為0
的列表可能會稍微增加內存和/或性能的效率。
對於Java 7 ,指定初始大小0
在功能上等同於不指定初始大小。
但是,它實際上效率較低,因為使用參數0
調用構造函數會導致調用new Object[0]
,而如果指定no-args構造函數,則列表的初始elementData
會設置為靜態定義的常量,名稱為EMPTY_ELEMENTDATA
。
ArrayList
源中的相關代碼:
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
換句話說,使用new ArrayList<Integer>(0);
似乎是多余的,這樣做沒有任何好處,我將使用new ArrayList<Integer>();
代替。
如果添加到ArrayList
的可能性確實很小,並且將ArrayList
的大小保持為最小很重要,那么我會發現這很有用。
或者,如果該ArrayList
的唯一目的是成為方法的返回值,則返回空列表是向函數調用方發送的特殊消息,例如“未找到結果”。
否則,不是真的。
默認情況下, ArrayList
容量為10,並且每次調整大小均為+ 50%。
通過使用較低的初始容量, 有時 (理論上)可以節省內存。 另一方面,每次調整大小都非常耗時。 在大多數情況下,這只是搶先優化的標志。
將較大的值(如果要超出列表的數量)分配給數組列表始終是更好的方法,因為這將減少列表的大小,從而優化執行時間。
初始化值為0
數組列表Empty
數組列表,如果您知道列表將不超過10
內容,則可以reducing memory
。
根據合同,可以通過不包含null來避免NullPointerExceptions。 在某些情況下,這是一個好習慣,請參閱Joshua Bloch撰寫的有效Java 項目43:返回空數組或集合,而不是null
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.