2011年11月20日

Java 源代碼分析系列 - ArrayList remove(int pst)


  public E remove(int paramInt)
  {
    RangeCheck(paramInt);
    this.modCount += 1;
    Object localObject = this.elementData[paramInt];
    int i = this.size - paramInt - 1;
    if (i > 0)
      System.arraycopy(this.elementData, paramInt + 1, this.elementData, paramInt, i);
    this.elementData[(--this.size)] = null;
    return localObject;
  }


  private void RangeCheck(int paramInt)
  {
    if (paramInt < this.size)
      return;
    throw new IndexOutOfBoundsException("Index: " + paramInt + ", Size: " + this.size);
  }

首先必須先確定使用者要刪除的位置是否有超出陣列範圍,這裡使用RangeCheck(int)來檢查,若是超出範圍則會丟出IndexOutOfBoundsException例外。

如果範圍合理沒有超出範圍,這時候會算出刪除位置後所剩下的元素個數,接著使用System.arraycopy()這個方法將欲刪除元素後的所有元素加入到欲刪除的位置上。
實際操作如下面圖解:

欲刪除紅色











使用System.arraycopy(this.elementData, paramInt + 1, this.elementData, paramInt, i);將剩餘的陣列連接起來














 +







該方法會將欲刪除部分之後(黃色)陣列連接到原來陣列欲刪除的位置(紅色)上。











this.elementData[(--this.size)] = null;
刪除最後一個元素










return localObject;
回傳值為取代後,位置pst上的新元素。






下一篇 :  Java 源代碼分析系列 - ArrayList remove(Object object)



沒有留言:

ShareThis