List类的使用

来源:互联网 发布:淘宝迟迟不发货怎么办 编辑:程序博客网 时间:2024/06/06 06:46

我们常用的List分为以下三种:ArrayList、LinkedList、Vector。今天,我们就来从源码角度分析以下这三种List:

一、ArrayList、LinkedList、Vector的异同与使用场景
一般来说,ArrayList与Vector都是使用数组来存储,LinkedList是使用双向链表进行存储,所以,ArrayList和Vector查找元素比较快,因为数组可以直接根据位置进行定位,而双向链表还需要根据链表头或者链表尾进行遍历查询。而在插入元素时,一般来说LinkedList比较快,因为双向链表只需要找到插入位置的前一个元素,然后进行插入即可(当然需要更改后一个元素的前驱),而因为数组是确定大小的,在尾部添加元素时,ArrayList与Vector都需要确认一下数组是否充足,如果不充足,还需要将数组进行扩大,再将原先的元素重新copy进去,而在中间插入元素时,ArrayList与Vector,ArrayList与Vector也需要确认一下数组是否充足,然后将插入位置的元素整体后移,所以一般来说,在插入元素时,LinkedList更快一些。

二、ArrayList、Vector源码分析与比较
比如add方法:
ArrayList:

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

Vector:

public synchronized boolean add(E e) {    modCount++;    ensureCapacityHelper(elementCount + 1);    elementData[elementCount++] = e;    return true;}

可以看到,ArrayList与Vector差别不大,不过Vector的add方法是线程安全的。
另外,在增加数组大小的grow()方法中
ArrayList:

private void grow(int minCapacity) {// overflow-conscious code    int oldCapacity = elementData.length;    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:    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);    if (newCapacity - minCapacity < 0)        newCapacity = minCapacity;    if (newCapacity - MAX_ARRAY_SIZE > 0)        newCapacity = hugeCapacity(minCapacity);    elementData = Arrays.copyOf(elementData, newCapacity);}

可以看到 ArrayList 一般是增加自己的一半,而Vector是增加自己的一倍。

原创粉丝点击