簡體   English   中英

創建初始容量為0的ArrayList的優點?

[英]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進行操作的特定於域的方法調用。 例如,假設您有一個包含學生姓名ListSchool班。 (保持簡單,請注意該類不是線程安全的。

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.

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