Java源碼解析之集合框架ArrayList-爲什麼初始化的時候最好設置默認大小?

因爲性能問題

下面有個簡單的例子來證明 “爲什麼初始化的時候最好設置默認大小”

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);
    }
發佈了22 篇原創文章 · 獲贊 41 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章