ArrayList的扩容机制,以及和LinkedList,Vestor的区别

首先我们先了解一下它们三者

ArrayList:的底层实现为数组存储在内存中,线程不同步。可通过数组下标的形式进行查找,所以在查询方面的效率较为出色,常用在查询较多的情景下。

LinkedList:的底层实现为链表形式,也为线程不同步。而链表的底层也决定了它在查询方面不如数组底层的ArrayList,而在指定位置插入等修改操作下,性能优于ArrayList

Vestor:也是和ArrayList、LinkedList一样实现了java.util.List接口。最大的区别在于Vestor是线程同步的,所以在效率方面不如另外两者,适用于多线程项目中

以上总结:ArrayList是Array(动态数组)的数据结构 ,当进行get和set操作的时候速度要优于LinkedList因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。 LinkedList是Link(链表)的数据结构,当进行add和remove操作时 LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。 而Vestor是它们三者中唯一一个线程安全的,所以效率不及两者

扩容机制

在翻阅arraylist源码时

  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);
    }
    }

如果不指定大小初始大小为10 扩容后的大小= 原始大小+原始大小/2 + 1。在进行插入等操作的时候,如果判断出大小不够,会依据此方法进行扩容。(以上是JDK1.6版本的源码,在JDK1.7中扩容规则进行了修改,改为了扩容后的大小= 原始大小+原始大小/2)

由于linkedlist它的底层是用双向链表实现的,没有初始化大小,也没有扩容的机制

猜你喜欢

转载自blog.csdn.net/smallredzi/article/details/84835387