這段代碼是番石榴庫的簡單代碼。在google guava庫中的newArrayList(E ...元素)的好奇心
我並簡化爲方便閱讀,原單代碼看到=>link
// Case A
public static <E> ArrayList<E> newArrayList(E... elements) {
int capacity = computeArrayListCapacity(elements.length);
ArrayList<E> list = new ArrayList<E>(capacity);
Collections.addAll(list, elements);
return list;
}
static int computeArrayListCapacity(int arraySize) {
long value = 5L + arraySize + (arraySize/10);
if (value > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (value < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
return (int) value;
}
爲什麼組容量5L + ARRAYSIZE +(ARRAYSIZE/10)?
3例(A,B,C)有什麼不同?
//Case B
public static <E> ArrayList<E> newArrayList(E... elements) {
ArrayList<E> list = new ArrayList<E>(elements.length);
Collections.addAll(list, elements);
return list;
}
//Case C
public static <E> ArrayList<E> newArrayList(E... elements) {
ArrayList<E> list = new ArrayList<E>();
Collections.addAll(list, elements);
return list;
}
那麼它會創建一個具有一點額外容量的新ArrayList。由於通常在使用動態計數的數據時使用列表,因此具有這樣的好處,即在添加下一個元素(情況b)時,列表不需要進行昂貴的調整大小。 調整大小是很昂貴的,因爲它是通過創建一個新的(更大的)數組並將所有現有元素複製到該新數組中完成的。 – Matthias
你用'Integer.MIN_VALUE'提問的部分是誤導性的,我建議刪除它(不是確切的,無論如何,因爲'saturatedCast'從來沒有做過兩個測試。 – maaartinus
@maaartinus是的,我沒有使用computeArrayListCapacity方法。你可以看到'5L + arraySize +(arraySize/10)'有一個「TODO:找出正確的行爲,並記錄下來」,這是代碼在guava-Ints.java中。 – ChangUZ