Java中的Vector和ArrayList

面试期间曾被问到,这里做个简单的总结。

Vector和ArrayList都是List<E>接口的实现类,内部均通过数组实现,适合随机遍历查找,不适合中间插入和删除。

通过Java的源码,可以窥视两者的不同。以add()方法为例:

Vector:

public synchronized boolean add(E e) {
    modCount++; // From AbstractList, count the Structural modifications
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
        return true;
    }

  /**
     * This implements the unsynchronized semantics of ensureCapacity.
     * Synchronized methods in this class can internally call this
     * method for ensuring capacity without incurring the cost of an
     * extra synchronization.
     *
     * @see #ensureCapacity(int)
     */
    private void ensureCapacityHelper(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object[] oldData = elementData;
        int newCapacity = (capacityIncrement > 0) ?
        (oldCapacity + capacityIncrement) : (oldCapacity * 2);
            if (newCapacity < minCapacity) {
        newCapacity = minCapacity;
        }
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

 

ArrayList:

public boolean add(E e) {
    ensureCapacity(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
    }

public void ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
            if (newCapacity < minCapacity)
        newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
    }
    }

 

根据上述源码可知:

1. Vector是线程安全,而ArrayList不是。所以在非多线程环境,应该选择ArrayList,避免线程安全的系统开销

2. 当存储空间不够的时候,Vector扩展一倍(oldCapacity*2),而ArrayList扩展一半+1个((oldCapacity * 3)/2 + 1)。

 

posted @ 2013-03-12 17:48  macemers  阅读(364)  评论(0编辑  收藏  举报