Java类集:Collection之List的常用实现类

本文将对List的三种常用实现类作详细说明。包括ArrayList,Vector,LinkedList。
其中,ArrayList和Vector均为数组,LinkedList则是链表。

1.ArrayList

ArrayList的底层实现结构是数组。

关于它的定义如下:

java 实体类是集合对应表字段 java集合的实现类_数据结构

如上图所示,它继承了AbstractList抽象类并实现了List接口,后面的几种接口不讲解。

优点:查找元素快

缺点:增加删除元素慢

常用的几种方法有:add()增加元素,remove()移除元素
get()获取下标对应元素,indexof()获取元素下标 等等

2.Vector

Vector的底层实现结构是数组。它是Java元老级的操作类。

关于它的定义如下:

java 实体类是集合对应表字段 java集合的实现类_List_02

如上图所示,它也继承了AbstractList抽象类并实现了List接口。

优点:增加删除元素快

缺点:查找元素慢

常用的几种方法和上述ArrayList类没有多大差别。

!!!看到这里,是不是觉得ArrayList和Vector似乎不管是在定义还是在方法的使用上几乎没有差别?它们的优缺点刚好相反。下面,我列出了它们二者的区别,可以帮助读者更好地理解二者的差异!

区别点

ArrayList

Vector

推出时间

于JDK1.2中推出的新类,属于比较新的类

最早实现动态对象数组的类,于JDK1.0时就已推出,元老级

性能

采用了异步处理,高性能

采用了同步处理,低性能

输出

支持迭代器Iterator、ListIterator输出

不仅支持迭代器Iterator、ListIterator输出,还支持Enumeratio输出

线程安全方面

线程不安全

线程安全

对于上述表格中作部分解释,这里的性能方面的强弱,与它们的交互方式有关,作个比喻,

异步就好比5个人一起收一片地的麦子,工作效率高,但是,这5个人的收割的速度不一样,会出现谁干得多谁干得少的问题,可能有人要吃亏;

同步则相当于5个人排队等着,前一个人收割结束了才能轮到下一个,要花费很久,工作效率低,但是,每个人该干多少干多少,不会对他人产生不公平。

线程安全问题也是上述这个原因,一个资源同时有多个线程访问,就有可能出错;但是让它们一个一个访问,就能保证安全。
迭代器的问题在后面会详细说明。

3.LinkedList

LinkedList的底层实现结构是双向链表。

关于它的定义如下:

java 实体类是集合对应表字段 java集合的实现类_集合_03

此类实现了AbstractSequentialList,而AbstractSequentialList继承自AbstractList,可以理解为是AbstractList的简化版,同时它也是继承自Queue接口的子类,Queue的方法它同样适用。

优点:插入删除元素快

缺点:查找元素慢

它的优缺点与它的实现原理有着直接关系。

链表,假如是下面这样

java 实体类是集合对应表字段 java集合的实现类_数据结构_04

我们如果要删除2元素,只需要将1.next指向3,断开2.next即可:

java 实体类是集合对应表字段 java集合的实现类_数据结构_05

插入元素和这个原理相同,假如我们要插入元素4:

java 实体类是集合对应表字段 java集合的实现类_java_06

只需将2.next指向4元素,同时让4.next指向3元素即可。

链表的插入与删除非常快。它的查找却是非常慢的。

原因是我们要查找一个元素时,需要从头节点开始检索,依次向后移动,直到找到或者走到链表尽头,这就导致耗时高,效率低。

它的常用方法有:add(),addfirst(),addlast(),removefirst(),removelast()等等

在后面会作更多说明。


欢迎指出问题或提出意见建议!