ArrayList 、LinkedList、Vector的区别

ArrayList 、LinkedList、Vector的区别

ArrayList、LinkedList、Vector都是实现了List接口

  1. ArrayList 本质上就是一个数组,当更多的元素添加到ArrayList中,其大小将会动态的进行增长,内部元素可以通过getset方法进行访问。

    elementDataObject类型的数组transient Object[] elementData;,保存添加到ArrayList中的数据。初始默认容量为initialCapacity,默认为DEFAULT_CAPACITY,容量为10 。size为ArrayList真正的容量,getset操作时都会通过rangeCheck(int index)方法对index进行判断,然后如果越界的话就会报出我们常见的IndexOutOfBoundsException异常。

    private static final int DEFAULT_CAPACITY = 10;
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {     //为空时直接给赋值DEFAULT_CAPACITY
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    private void rangeCheck(int index) {    //set get操作时进行的越界判断方法
            if (index < 0 || index >= this.size)
                throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        }
  1. LinkedList是一个双链表,因此在删除和添加元素的时候便优于数组形式的ArrayList,但是在get与set方面弱于ArrayList.

    getFirst();
    getLast();
    获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
    removeFirst();
    removeLast();
    获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
    peekFirst();
    peekLast();
    获取元素,但不删除元素。如果集合中没有元素,会返回null。
    pollFirst();
    pollLast();
    获取元素,但是元素被删除。如果集合中没有元素,会返回null。

  2. Vector几乎和ArrayList相同,但是Vector是线程安全的。Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%。

    //ArrayList中
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);     //通过位运算,每次增加50%
        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:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    //Vector中
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity); //增加量为oldCapacity,即为增加一倍
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容