2011年11月20日

Java 源代碼分析系列 - ArrayList add()


  public boolean add(E paramE)
  {
    ensureCapacity(this.size + 1);
    this.elementData[(this.size++)] = paramE;
    return true;
  }


首先可以看到add這個方法的參數是以E開頭,表示該參數可以是任何的類別。
ensureCapacity方法用來確認容量是否足以加入新的節點。
  public void ensureCapacity(int paramInt)
  {
    this.modCount += 1;
    int i = this.elementData.length;
    if (paramInt <= i)
      return;
    Object[] arrayOfObject = this.elementData;
    int j = i * 3 / 2 + 1;
    if (j < paramInt)
      j = paramInt;
    this.elementData = Arrays.copyOf(this.elementData, j);
  }
這段比較有趣的地方是,j = i * 3 / 2 + 1這段,可以看出配置空間的動作並不是每次配置一次(+1)的方式,而是以這個公式去新增,一次可能配出許多個空間預留給下次的加入。
比如說現在List中有10個元素,當我們要加入第十一個元素時,11會被傳入ensureCapacity方法,可以看到if (paramInt <= i),明顯是大於的因此繼續執行,執行到j這行時,j = 11 * 3 / 2 + 1 = 16;因此系統在此時會把原本size10的陣列變成size16陣列,在ensureCapacity結束後,新的元素順利加入。

圖解 :
假設目前陣列長度 = 10










add(‘test’); // 11個元素
加入第11元素因為空間不夠,所組需要從新配置空間,陣列長度 = 16
















add(‘test’); // 12個元素
空間足夠,無須從新配置,直接加入。
















沒有留言:

ShareThis