Java 集合類型之ArrayList 源碼解析

層次結構

頂層層次結構

  ArrayList實際上是繼承了AbstractList,同事實現了List,RandomAccess,Clonable,Serializable序列化接口。

AbstractList

  AbstractList抽象類繼承了AbstractCollection並實現了List接口,其中AbstractCollection實現了Collection接口。

 

ArrayList源碼分析

屬性

1 private static final int DEFAULT_CAPACITY = 10; //默認容量
 private static final Object[] EMPTY_ELEMENTDATA = {}; //共享空數組實例爲空的實例們使用。
//爲默認的空實例準備的共享的空數組實例。我們區別於EMPTY_ELEMENTDATA以辨別膨脹多少當第一個元素被添加的時候。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//這個數組緩衝區進入數組的元素被存儲。
//數組的容積是數組緩衝區的長度。
//任何空的數組帶數組元素等於DEFAULTCAPACITY_EMPTY_ELEMENTDATA會被展開到DEFAULT_CAPACITY當數組當中第一個元素被添加進去。
transient Object[] elementData;//非私有被簡化嵌套類的訪問
private int size;//數組的大小(有多少元素它包含)

方法

//構造一個空的ArrayList帶10的初始化長度。
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

 

/*
  構造一個list包含集合選擇的一些元素,在這個隊列當中,它們被集合的迭代器返回。  
param c 這個集合誰的元素被放入list當中
throws NullPointerException 如果指定的集合爲空
*/
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray(錯誤的)不返回數組對象。
            // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            //被替代爲空數組
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章