List总结
List 是一个接口,它继承于Collection的接口。它代表着有序的队列。
AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的的函数
AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。
ArrayList, LinkedList, Vector, Stack是List的4个实现类。
ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。
Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。
ArrayList和LinkedList的比较
- 线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全。
- 底层数据结构:ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。此相较于ArrayList,LinkedList不需要关心内部容量的问题。ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
- 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于
get(int index)
方法)。LinkedList在根据索引位置来对内部数据进行操作时需要遍历到指定位置再进行,而ArrayList 由于数组的空间是连续的,所以不需要进行查找便可以直接返回。 - 效率:LinkedList增删快,ArrayList随机访问效率高。
Vector和ArrayList比较
- 线程安全: ArrayList是非线程安全;而Vector是线程安全的。
- 序列化支持:rrayList支持序列化,而Vector不支持;即ArrayList有实现java.io.Serializable接口,而Vector没有实现该接口。
- 底层数据结构:ArrayList和Vector内部都是基于数组的,在内部容量不足时,ArrayList的容量会扩大到当前容量的1.5倍(newCapacity = oldCapacity + (oldCapacity >> 1);),而Vector内部存在内部变量增长系数,当设置了该值时,则在扩容时会增长该值数量的容量,否则会扩大到当前容量的2倍(newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);)。
- 遍历方式:Vector支持通过Enumeration去遍历,而List不支持。