ArrayLIst、Vector和LinkedList三者的区别
1、从存储结构来看:
ArrayList和Vector是由数组构成,其默认的初始容量为10。而LinkedList是由双向链表构成(含头结点)。
2、从线程安全来看:
ArrayList和LinkedList是线程不安全的,如果需要在并发的环境下使用它们,可以用Collections类中的静态方法synchronizedList()对ArrayList和LinkedList进行调用即可。
而Vector是线程安全的,它的源码中的大部分方法都包含关键字sydnchronized。
但是Vector的效率没有ArrayList和LinkedList高。
3、从扩容机制来看:
首先,LinkedList是没有扩容的,因为是链表实现的,这个我们不需要管。
下面我们来看,ArrayList和Vector的扩容机制:
(1)ArrayList扩容之后的容量是之前的1.5倍(默认)。
(2)Vector扩容之后的容量是之前的两倍(默认)。
(3)其中Vector可以设置容量增量,而ArrayList不可以设置。
4、从增删查改的效率来看:
(1)ArrayList和Vector:如果是在指定位置检索,或者是在集合尾部进行插入和删除的话,时间复杂度是O(1),但是如果是其他地方插入或者删除的话,时间复杂度就变成了O(n)。
(2)LinkedList:它的插入和删除的时间复杂度都是O(1),但是它的检索一个元素的话,时间复杂度就O(n)。
注意:
在这里需要说一下可变长度数组的原理:当元素个数超过数组的长度时,会产生一个新的数组,将原数组的数据复制到新数组,再将新的元素添加到新数组中。