概要
先上一张图:在图中我们知道他们具体继承之间的关系。
- List是一个接口,继承于Collection,是一个有序队列(Set也是继承于Collection,但是他是一个集合。
- AbstractList是一个抽象类,继承于AbstractCollection;他实现了List的除了Size,get(int location)外的全部函数。
- AbstractSequentialList也是一个抽象类,他继承于AbstractList,实现了链表的操作。
- 然而真正的实现类是:LinkedList、Vector、Stack、ArrayList。
LinkedList是一个双向链表,但是也可以当做队列,栈。双端口队列使用,他的随机访问速率很低,但随机插入、删除效率是最高的。
ArrayList是一个动态数组,由于实现一个数组,他和LinkedList相反,随机访问速率很高,但是随机插入、删除效率很低。
Vector是一个矢量队列,和ArrayList几乎是一样的,唯一的区别就是一个是线程安全的(Vector),一个是线程不安全的(ArrayList).
Stack是一个栈,继承于Vector,虽然主要操作只有3个,但是他是拥有Vector的全部属性的,结构特点是,先进后出。
使用场景比较
总的来说,List的实现类都经常用于栈、队列,链表中。
LinkedList是在于要求随机插入和随机删除效率要求比较高的上面,使用LinkedList。
ArrayList是用于在随机访问要求高的地方使用。
Vector和ArrayList一样,但是Vector使用在多线程中(因为他是线程安全的),ArrayList一般使用在单线程中(线程不安全)。使用在多线程的还有CopyOnWriteArrayList。
Stack栈的操作使用最多。
ArrayList和LinkedList性能差别的原因
随机访问:
LinkedList的随机访问他是先判断location 的值是不是大于中间索引的值,如果大于从链表的后面开始查找,反之从前面开始查找;然而ArrayList是直接返回。故在随机访问上面ArrayList是比LinkedList是要强的。
随机插入、删除
LinkedList的随机插入、删除,他先是找到插入点Location,然后在插入点的后面直接插入,其中还有一个加速过程,Location的值如果小于中间索引值,那么从前面开始查找,反之从后面开始查找。ArrayList的随机插入、删除,和普通数组的插入,删除一样,他将会移动大量的数据,所以造成效率低下。故在随机插入和随机删除上来说,ArrayList的效率比不上LinkedList。
Vector和ArrayList比较
同:
- 他们都是List:都继承于AbstractList,并且都实现了List接口。
- 都实现了RandomAccess接口和Cloneable:都可以随机访问和可以克隆自己。
- 都是通过数组实现,本质上都是动态数组。
- 默认大小都是10.
- 都支持Iterator迭代遍历
异
- 线程安全不一样(这个就不说了)
- ArrayList实现了java.io.Serializable,然而Vector没有实现。所以一个支持序列化,一个不支持序列化。
- 容量的增加方式不同,ArrayList的增加方式:(原容量)*3/2+1;Vector在增长系数不为0的情况下:原容量+增长系数;增长系数为0:原容量*2.
- Enumeration,ArrayList不支持Enumeration遍历。