JAVA集合下的List实现类的相互比较

概要

先上一张图:在图中我们知道他们具体继承之间的关系。

  1. List是一个接口,继承于Collection,是一个有序队列(Set也是继承于Collection,但是他是一个集合。
  2. AbstractList是一个抽象类,继承于AbstractCollection;他实现了List的除了Size,get(int location)外的全部函数。
  3. AbstractSequentialList也是一个抽象类,他继承于AbstractList,实现了链表的操作。
  4. 然而真正的实现类是: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比较

同:

  1. 他们都是List:都继承于AbstractList,并且都实现了List接口。
  2. 都实现了RandomAccess接口和Cloneable:都可以随机访问和可以克隆自己。
  3. 都是通过数组实现,本质上都是动态数组。
  4. 默认大小都是10.
  5. 都支持Iterator迭代遍历

  1. 线程安全不一样(这个就不说了)
  2. ArrayList实现了java.io.Serializable,然而Vector没有实现。所以一个支持序列化,一个不支持序列化。
  3. 容量的增加方式不同,ArrayList的增加方式:(原容量)*3/2+1;Vector在增长系数不为0的情况下:原容量+增长系数;增长系数为0:原容量*2.
  4. Enumeration,ArrayList不支持Enumeration遍历。
posted @ 2018-09-08 09:32  轻抚丶两袖风尘  阅读(921)  评论(0编辑  收藏  举报