Java集合类-ArrayList

ArrayList的是常用List接口的实现类,其中的元素的顺序是按照元素插入的顺序,其内部的实现是动态对象数组,因此在内存中是连续存储的。因此,元素的随机访问效率很高,然而对其中间的元素进行插入和删除的操作效率较低,因为需要移动其它元素。

由源码不难看出,对ArrayList中元素的操作最终都是直接对对象数组的操作。ArrayList的默认初始大小为10,扩容时策略是以旧容量的1.5倍扩容,扩容的方式是简单粗暴地拷贝(Arrays.copyOf())。因此,如果在初始化时能预估数据的规模,就会避免这个耗时的扩容过程,提高效率。

下面是ArrayList的源码实现:

private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private transient Object[] elementData;
public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException(
          "Illegal Capacity: " + initialCapacity);
    this.elementData = new Object[initialCapacity];
}
public ArrayList() {
    super();
    this.elementData = EMPTY_ELEMENTDATA;
}
public ArrayList(Collection c) {
    elementData = c.toArray();
    size = elementData.length;
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}

-- EOF --

你可能感兴趣的:(Java集合类-ArrayList)