首先我们先了解一下它们三者
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它的底层是用双向链表实现的,没有初始化大小,也没有扩容的机制