2013-07-12 42 views
-2

我有這樣定義的,如果沒有指定大小一個集合 -如果我需要初始化靜態最終集合

private final static Collection<String> mycollection = new ArrayList<String>(); 
static { 
    mycollection.add("mystr"); 
} 

另外還有一點需要一個尺寸構造函數,例如

private final static Collection<String> mycollection = new ArrayList<String>(1);  
static { 
    mycollection.add("mystr"); 
} 

由於集合是最終的,我應該構造它以便它是一個特定的大小?

+0

如果你有一個固定的大小,它將是'final',爲什麼不是一個數組? – Gamb

+0

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(int) - 嚴重的是,閱讀Javadoc還是解釋了區別。 –

回答

3

設置ArrayList的初始大小可減少內部存儲器重新分配的次數。如果在構造函數中沒有設置容量的情況下創建一個ArrayList,它將創建一個默認值,我猜測它是10. ArrayList是一個動態調整大小的數據結構,實現爲具有初始(默認)固定大小的數組。如果你知道你的項目的上限,那麼創建初始長度的數組我認爲更好。

ArrayList()構造函數的文檔:

構造一個具有十一個初始容量的空列表。

然而,ArrayList(int initialCapacity)

構造具有指定初始容量的空列表。

由於集合是最終的,我應該構造它以便它是一個特定的大小?

參考變量是final,它只能指向一個對象,在本例中爲ArrayList。這並不意味着ArrayList本身的內容或屬性不能改變。請參閱JLS 4.12.4

一旦最終的變數已被分配,它總是包含相同的值。如果最後一個變量持有對某個對象的引用,則可以通過對該對象的操作來更改該對象的狀態,但該變量將始終引用同一個對象。

+0

如果不斷添加元素,ArrayList的內部'array'將會增長。這只是一個使用的味道問題。如果這將是一個生產代碼,那麼您將只在初始數組中保存9個存儲桶。 –

+0

爲什麼10?不是'0'? –

0

前者使用empty ArrayList constructor,初始默認容量爲10(參考上一個鏈接),而後者使用ArrayList(int) constructor,您將設置初始容量。

如果初始化,我們是否有任何內存或性能影響?

如果具有256個宏塊使用時節省初始陣列配置至少9個字節,那麼我會說沒有

如果你擔心被ArrayList使用的內部array的初始容量,這裏有兩個優秀的Q /作爲對主題:

+1

如果我初始化,是否有任何內存或性能影響? – user2577756

+0

@ user2577756空'ArrayList'構造函數的默認容量是10.所以,不,在這種情況下使用一個或另一個沒有太大的影響。 –

+0

@ user2577756答案已更新。 –

1

正如official JavaDoc說:

public ArrayList(int initialCapacity) 構造具有指定初始容量的空列表。
public ArrayList() 構造一個初始容量爲10的空列表。

所以,如果你不打算添加更多的元素,第一種方法需要更少的內存。但是,如果要爲集合添加更多元素,第二種方法不需要儘快重新分配新的後備陣列。

0

第二種方法會爲您節省一些內存(默認初始容量等於十)。假設你不會改變列表的內容(當你添加新元素時,底層數組會增長)。

請注意,集合不是不可變的(),只有引用是最終的。對於不可變列表,使用Collections.unmodifiableListCollections.unmodifiableCollection方法是這樣的:

private final static Collection<String> mycollection;  
static { 
    List<String> tempList = new ArrayList<String>(1); 
    tempList.add("mystr"); 
    mycollection = Collections.unmodifiableCollection(tempList); 
} 
0

通過detault,ArrayList中創建並在這10個元素的數組的內部數據結構,如果你不傳遞任何參數在裏面。

但是,如果您將initialCapacity參數配置給它,那麼您將爲其分配一個初始值,這可能會提高您在事先知道ArrayList大小時的性能。

公衆的ArrayList(INT參數:initialCapacity)

所以,你的情況,如果有不使任何區別只有一個元素,但它的列表將會增加更多,降低了初始容量將使其對再次重新創建數組。