• [置顶] Vector ArrayList区别剖析


    Java中Vector与ArrayList的区别?这是一个很常见的面试题目:)

    Vector与ArrayList其实是非常相似的,不信,你可以看看源码,如果说真的有什么区别的话,大概有以下三点:

    1:Vector比ArrayList出现的更早,因此早期的程序可能只支持Vector

    2:Vector是多线程安全的,而ArrayList不是,这也决定了ArrayList效率要高于Vector

    3:Vector与ArrayList都采用的是线性连续空间存储元素,当空间不足时,Vector增加原来空间的一倍,而ArrayList只增加原来空间的50%.

    4:Vector可以设置增长因子,而ArrayList则不行

    看看其核心实现源码,就可以知道了:

    Vector如何支持多线程

        public synchronized void copyInto(Object[] anArray) {//看看那个synchronized关键字,是线程安全的吧
    	System.arraycopy(elementData, 0, anArray, 0, elementCount);
        }

    ArrayList源码中随便一个函数,你都是看不到关键字synchronized的

        public Object[] toArray() {
            return Arrays.copyOf(elementData, size);
        }

    所以从以上代码中可以看出的是Vector确实是线程安全的,而ArrayList则不是,因此ArrayList的效率要高于Vector,因为其不需要负责锁的打开与关闭。

    Vector的内存增长速度

    private void ensureCapacityHelper(int minCapacity) {
    //获取容器当前的大小
    	int oldCapacity = elementData.length;
        //如果增加元素后大小超过了当前容器的范围,则执行下面的逻辑
    	if (minCapacity > oldCapacity) {
    	    Object[] oldData = elementData;
    		//从这里可以看出的是如果没有设置增长因子的话,则以2倍速度增长
    	    int newCapacity = (capacityIncrement > 0) ?
    		(oldCapacity + capacityIncrement) : (oldCapacity * 2);
             //如果增长后仍然不足以存放新增的元素,则直接将其大小设置为新大小
        	    if (newCapacity < minCapacity) {
    		newCapacity = minCapacity;
    	    }
    		//直接执行复制操作
            elementData = Arrays.copyOf(elementData, newCapacity);
    	}
        }
    

    ArrayList的内存增长速度

    public void ensureCapacity(int minCapacity) {
    	modCount++;
    	//获取当前容器的大小
    	int oldCapacity = elementData.length;
    	//如果填加一个元素后,新容器的大小minCapacity大于oldCapacity,则表示容器已
        //无法存放元素了,执行下面的逻辑
    	if (minCapacity > oldCapacity) {
    	    Object oldData[] = elementData;
            //重新设定容器的大小,新容器的大小,为原来容器的150%倍+1
    	    int newCapacity = (oldCapacity * 3)/2 + 1;
            //容器增大后,如果还不够存放的话,就执行下面的逻辑
        	    if (newCapacity < minCapacity)
    		//将容器的大小直接设为minCapacity
    		newCapacity = minCapacity;
                // minCapacity is usually close to size, so this is a win:
            //这里会重新开僻空间,并将原来的元素copy进去
                elementData = Arrays.copyOf(elementData, newCapacity);
    	}
    

    从上面的代码中可以看出内存空间的增长速度,Vector要高于ArrayList,也可以看出Vector是有增长因子的,但是ArrayList是没有增长因子的。

  • 相关阅读:
    jPlayer
    nodemon
    微信
    防盗链
    ES2015 (ES6)
    静态资源
    WebP
    Retina
    ui-grid
    React入门2
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3233904.html
Copyright © 2020-2023  润新知