我愛HashSet的<>()同時初始化這與默認的構造函數中使用這個期待:爲什麼初始化HashSet <>(0)爲零?
Set<Users> users = new HashSet<>();
現在,我的自動豆創作者(JBoss的工具)初始化爲:
Set<Users> users = new HashSet<>(0);
爲什麼爲零?該API告訴我這是的初始容量,但將其歸零的優勢是什麼?這是建議嗎?
我愛HashSet的<>()同時初始化這與默認的構造函數中使用這個期待:爲什麼初始化HashSet <>(0)爲零?
Set<Users> users = new HashSet<>();
現在,我的自動豆創作者(JBoss的工具)初始化爲:
Set<Users> users = new HashSet<>(0);
爲什麼爲零?該API告訴我這是的初始容量,但將其歸零的優勢是什麼?這是建議嗎?
default initial capacity is 16,所以通過傳入0,你可以節省幾個字節的內存,如果你最終沒有放入任何東西的話。
除此之外沒有真正的優勢;當你傳遞0時,該集合的容量爲1,並且只要添加了一些內容就必須調整大小。
有一些線索。
迭代此集合需要的時間與HashSet實例的大小(元素數)加上支持HashMap實例(桶的數量)的「容量」的總和成正比。因此,如果迭代性能很重要,不要將初始容量設置得太高(或者負載因子太低)是非常重要的。
HashSet的使用HashMap中存儲數據:
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
而參數:initialCapacity = 0,
public HashMap(int initialCapacity, float loadFactor) {
....
// Find a power of 2 >= initialCapacity
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
}
HashMap中容量是1
。
但如果使用默認的構造函數:
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
HashMap的容量爲16*0.75
。
那麼,new HashSet<>(0)
init時會保存一些memroy。
這會將其設置爲最小值。
很可能這是用來關閉代碼分析器,如果您尚未設置集合的初始容量,則代碼分析器可能會投訴。通過將其設置爲0,您可以將其設置爲最小值。
這不是一個很好的優化,因爲只要添加一個條目,負載因子0.7就會使容量2重新創建Map.Entry[]
。
HashMap的初始加載因子爲16.當HashMap包含12個記錄的數據時,它是其初始大小的75%。那麼HashMap會增加它的大小。
所以在這裏我們只是通過在構造函數中傳遞它來將初始容量設置爲0。
@PeterLawrey最小也是16?那麼0不應該工作? – Aquillo
@PeterLawrey,怎麼回事?不是2? –
+1對不起,對於此構造函數,最小值爲1. –