Java面试集-基础-List集合

Vector和ArrayList区别,代码是完全一样的,不同的是:

  1. Vector的add方法加了synchronized
  2. Vector扩容时增长1倍,ArrayList扩容增长50%。

ArrayList

数据结构:使用数组存放数据


  1. JDK1.6之前是初始化时扩容。JDK1.7是在add方法中扩容,默认是10,扩容时为旧数值的1.5倍。

  2. 线程是不安全的原因是因为size是静态变量。

    public boolean add(E e) {
    /**
     * 添加一个元素时,做了如下两步操作
     * 1.判断列表的capacity容量是否足够,是否需要扩容
     * 2.真正将元素放在列表的元素数组里面
     */
     
     //注意:静态变量size,第一次调用add时为0,第二次为1,因为是后加1
        ensureCapacityInternal(size + 1);  
        //多线程并发时,size可能被其他线程变更过
        elementData[size++] = e;
        return true;
    }
    
  3. add方法扩容的代码

    private void grow(int minCapacity) {
        //源数据的长度
        int oldCapacity = elementData.length;
        //新长度 = 源数据长度+源数据长度的1.5倍数值.
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //新长度-最小扩容长度
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //参数1:为源数组,参数2:新数组长度
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    
  4. remove方法的核心代码

    System.arrayCopy(Object src,  int  srcPos,Object dest, int destPos,                            int length)
    

    src - 源数组。
    srcPos - 源数组中的起始位置。
    dest - 目标数组。
    destPos - 目标数据中的起始位置。
    length - 要复制的数组元素的数量。

    remove索引是高效的
    remove性能有问题:for循环比较对象,再调用删除索引的方法

Vector

与ArrayList底层代码完全一致,除了synchronized,和数组扩增不同以外。

你可能感兴趣的:(Java面试集-基础-List集合)