zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    vba --barcode9.0 生成 code39
    利用JS 阻止表单提交
    VS2012变化的快捷键
    鼠标右击禁用
    计算机算法常用术语中英对照
    GrideView(三)---编辑功能实现
    GrideView(二)---删除功能
    GridView认识(一)
    微软 自带 AJAX 拓展
    C#日期函数使用大全
  • 原文地址:https://www.cnblogs.com/techyc/p/2956173.html
Copyright © 2011-2022 走看看