JAVA集合類之ArrayList源碼分析

 ArrayList繼承自AbstractList抽象類,實現了List接口。java

 public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList類中存儲數據用的是Object類型的數組算法

private transient Object[] elementData;

此處的elementData使用了transient關鍵字進行了修飾。被transient關鍵字修飾的變量在對象序列化時是不操做的。那ArrayList對象在序列化時,elementData數組是否真的就不處理呢?咱們來看writeObject函數:數組

s.defaultWriteObject();
// Write out array length
s.writeInt(elementData.length);
// Write out all elements in the proper order.
for (int i=0; i<size; i++)
            s.writeObject(elementData[i]);

其實elementData是人爲的進行序列化了。安全

 

實例化ArrayList對象時,默認數組的大小爲10.dom

public ArrayList() {
 this(10);
}

ArrayList元素數組在擴大時,擴大的算法是:(目前大小)*3/2+1ide

int newCapacity = (oldCapacity * 3)/2 + 1;

 

add(E e) 函數:函數

ensureCapacity(size + 1);  // Increments modCount!!
elementData[size++] = e;

 先擴容數組,而後在數組尾部追加新元素。this

 

add(int index, E element)函數:線程

ensureCapacity(size+1);  // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
    size - index);
elementData[index] = element;
 size++;

一樣也是先擴容數組,接着調用System.arraycopy將數組元素進行調整,而後在指定位置index處,插入新元素。對象

 

由此能夠得出,向ArrayList中添加元素時,儘可能使用add函數,這樣效率高。

 

讀取元素直接根據下標從elementData中獲取

RangeCheck(index);
return (E) elementData[index];

 

總結:

ArrayList一個基於數組的線性表,同時它不是線程安全的。讀取元素效率高,寫入元素效率偏低。

所以ArrayList不適用於頻繁作插入和刪除操做。

相關文章
相關標籤/搜索