ArrayList原始碼閱讀筆記

20170405發表於2020-08-18

  原始碼分析

  屬性

  首先看看ArrayList的屬性。

  /**

  * 預設初始化容量

  */

  private static final int DEFAULT_CAPACITY = 10;

  /**

  * 空陣列,如果傳入的容量為0時使用

  */

  private static final Object[] EMPTY_ELEMENTDATA = {};

  /**

  *空陣列,傳傳入容量時使用,新增第一個元素的時候會重新初始為預設容量大小

  */

  private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

  /**

  *儲存資料元素的陣列

  */

  transient Object[] elementData; // non-private to simplify nested class access

  /**

  * ArrayList的大小(包含資料元素的個數)

  */

  private int size;

  構造方法

  無參構造方法

  /**

  * 建立一個初始容量為10的空列表

  */

  public ArrayList() {

  this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;

  }

  1234567

  指定初始容量的構造方法

  /**

  * 建立一個指定容量的list

  */

  public ArrayList(int initialCapacity) {

  // 如果傳入的初始容量大於0,就新建一個陣列儲存元素

  if (initialCapacity > 0) {

  this.elementData = new Object[initialCapacity];

  } else if (initialCapacity == 0) {

  // 如果傳入的初始容量等於0,使用空陣列EMPTY_ELEMENTDATA

  this.elementData = EMPTY_ELEMENTDATA;

  } else {

  throw new IllegalArgumentException("Illegal Capacity: "+

  initialCapacity);

  }

  }

  從其它集合構造

  /**

  * 把傳入集合的元素初始化到ArrayL ist中    m/

  */

  public ArrayList(Collection c) {

  //把集合轉為陣列

  elementData = c.toArray();

  if ((size = elementData.length) != 0) {

  // 檢查c.toArray()返回的是不是Object[]型別,如果不是,重新複製成Object[].class型別

  if (elementData.getClass() != Object[].class)

  elementData = Arrays.copyOf(elementData, size, Object[].class);

  } else {

  // 如果是空集合,則初始化為空陣列EMPTY_ELEMENTDATA

  this.elementData = EMPTY_ELEMENTDATA;

  }

  }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69979119/viewspace-2712553/,如需轉載,請註明出處,否則將追究法律責任。

相關文章