Java类集:Collection之List的常用实现类
本文将对List的三种常用实现类作详细说明。包括ArrayList,Vector,LinkedList。
其中,ArrayList和Vector均为数组,LinkedList则是链表。
1.ArrayList
ArrayList的底层实现结构是数组。
关于它的定义如下:
如上图所示,它继承了AbstractList抽象类并实现了List接口,后面的几种接口不讲解。
优点:查找元素快
缺点:增加删除元素慢
常用的几种方法有:add()增加元素,remove()移除元素,
get()获取下标对应元素,indexof()获取元素下标 等等
2.Vector
Vector的底层实现结构是数组。它是Java元老级的操作类。
关于它的定义如下:
如上图所示,它也继承了AbstractList抽象类并实现了List接口。
优点:增加删除元素快
缺点:查找元素慢
常用的几种方法和上述ArrayList类没有多大差别。
!!!看到这里,是不是觉得ArrayList和Vector似乎不管是在定义还是在方法的使用上几乎没有差别?它们的优缺点刚好相反。下面,我列出了它们二者的区别,可以帮助读者更好地理解二者的差异!
区别点 | ArrayList | Vector |
推出时间 | 于JDK1.2中推出的新类,属于比较新的类 | 最早实现动态对象数组的类,于JDK1.0时就已推出,元老级 |
性能 | 采用了异步处理,高性能 | 采用了同步处理,低性能 |
输出 | 支持迭代器Iterator、ListIterator输出 | 不仅支持迭代器Iterator、ListIterator输出,还支持Enumeratio输出 |
线程安全方面 | 线程不安全 | 线程安全 |
对于上述表格中作部分解释,这里的性能方面的强弱,与它们的交互方式有关,作个比喻,
异步就好比5个人一起收一片地的麦子,工作效率高,但是,这5个人的收割的速度不一样,会出现谁干得多谁干得少的问题,可能有人要吃亏;
同步则相当于5个人排队等着,前一个人收割结束了才能轮到下一个,要花费很久,工作效率低,但是,每个人该干多少干多少,不会对他人产生不公平。
线程安全问题也是上述这个原因,一个资源同时有多个线程访问,就有可能出错;但是让它们一个一个访问,就能保证安全。
迭代器的问题在后面会详细说明。
3.LinkedList
LinkedList的底层实现结构是双向链表。
关于它的定义如下:
此类实现了AbstractSequentialList,而AbstractSequentialList继承自AbstractList,可以理解为是AbstractList的简化版,同时它也是继承自Queue接口的子类,Queue的方法它同样适用。
优点:插入删除元素快
缺点:查找元素慢
它的优缺点与它的实现原理有着直接关系。
链表,假如是下面这样
我们如果要删除2元素,只需要将1.next指向3,断开2.next即可:
插入元素和这个原理相同,假如我们要插入元素4:
只需将2.next指向4元素,同时让4.next指向3元素即可。
链表的插入与删除非常快。它的查找却是非常慢的。
原因是我们要查找一个元素时,需要从头节点开始检索,依次向后移动,直到找到或者走到链表尽头,这就导致耗时高,效率低。
它的常用方法有:add(),addfirst(),addlast(),removefirst(),removelast()等等
在后面会作更多说明。
欢迎指出问题或提出意见建议!