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不适用于频繁作插入和删除操做。