ArrayList、LinkedList与Vector的区别
在实际开发的过程中,我们经常使用到这三个集合,了解它们的特点对我们的开发会有很大的帮助
【1】底层数据结构
集合 | 底层数据结构 |
ArrayList | 动态数组 |
LinkedList | 双向链表 |
Vector | 动态数组 |
(1)由于ArrayList和Vector底层都是基于动态数组的,因此我们可以通过使用序号来索引元素
【2】各自优势与劣势
集合 | 优势 | 劣势 |
ArrayList | 随机访问 | 增删操作 |
LinkedList | 增删操作 | 随机访问 |
Vector | 随机访问 | 增删操作 |
(1)由于动态数组中的元素在内存中存储的位置是连续的,因此随机访问效率比较高。但每删除一个元素,都要把该元素后面的所有元素向前移动,效率不高。
(2)双向链表中的元素存储的位置是不连续的,各个节点仅仅靠指针连接,在进行随机访问时,必须先从头节点开始遍历。但在节点的删除操作上,只需要断开这个节点两旁的指针再进行指针连接即可,不需要移动元素。
【3】多线程情况下
集合 | 特点 |
ArrayList | 线程不安全 |
LinkedList | 线程不安全 |
Vector | 线程安全 |
(1)Vector中的方法类似于ArrayList,但大部分都加了同步处理,所以Vector的效率略低于ArrayList
PS:线程安全的类有哪些?
有一个记法:喂,她
其实就是V、S、H、E
记法 | 类 |
V | Vector |
S | Stack |
H | HashTable |
E | Enumeration |
【4】初始容量与扩容规则
集合 | 初始容量 | 扩容规则 |
ArrayList | 10 | 原来的1.5倍 |
LinkedList | 0 | 每次加1 |
Vector | 10 | 原来的2倍 |
【5】实现与继承
集合 | 实现了 | 继承了 |
ArrayList | List | AbstractList |
LinkedList | List Deque | AbstractSequentialList |
Vector | List | AbstractList |