因爲性能問題
下面有個簡單的例子來證明 “爲什麼初始化的時候最好設置默認大小”
public static void main(String[] args) {
//得到當前時間
Long nowTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
//默認不設置大小
List<Integer> defaultIntegers = new ArrayList<>();
defaultIntegers.add(1);
}
System.out.println("不設置默認大小,消耗的時間是:" + (System.currentTimeMillis() - nowTime) + "毫秒");
nowTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
//初始化默認大小
List<Integer> initIntegers = new ArrayList<>(1);
initIntegers.add(1);
}
System.out.println("初始化默認大小,消耗的時間是:" + (System.currentTimeMillis() - nowTime) + "毫秒");
}
輸出結果
由此可以看出來,設置初始化大小的ArrayList的對象運算會比沒有設置ArrayList大小的對象耗時更多,其深層次的原因是若ArrayList對象沒有初始化大小時,第一次調用add方法會額外調用grow方法爲該數組對象進行擴容和內存移動
public boolean add(E e) {
modCount++;
add(e, elementData, size);//該方法回調用下面的方法
return true;
}
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();//如果初始化爲空數組
elementData[s] = e;
size = s + 1;
}
private Object[] grow() {
return grow(size + 1);
}
/**
* 增加數組的容量,以確保它至少可以容納minCapacity參數指定的元素數量
*/
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,newCapacity(minCapacity));
}
/**
* 計算需要新增的擴容長度
*/
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}