一、介绍先回顾一下List的框架图
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I23T5-0.jpg)
文章插图
由图中的继承关系,可以知道,ArrayList、LinkedList、Vector、Stack都是List的四个实现类 。
- AbstractList是一个抽象类,它继承于AbstractCollection 。AbstractList实现List接口中除size()、get(int location)之外的函数 。
- AbstractSequentialList 是一个抽象类,它继承于AbstractList 。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数” 。
- ArrayList 是一个数组队列,相当于动态数组 。它由数组实现,随机访问效率高,随机插入、随机删除效率低 。
- LinkedList 是一个双向链表 。它也可以被当作堆栈、队列或双端队列进行操作 。LinkedList随机访问效率低,但随机插入、随机删除效率低 。
- Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现 。但是ArrayList是非线程安全的,而Vector是线程安全的 。
- Stack 是栈,它继承于Vector 。它的特性是:先进后出(FILO, First In Last Out) 。
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I251L-1.jpg)
文章插图
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I25462-2.jpg)
文章插图
得到的结果如下
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I25935-3.jpg)
文章插图
根据结果,可以很明显的看出ArrayList、LinkedList、Vector、Stack的性能有很大的区别 。
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I2G48-4.jpg)
文章插图
读取:ArrayList > Vector > Stack > LinkedList
插入:LinkedList > Vector > ArrayList > Stack
删除:LinkedList > Vector > ArrayList > Stack
三、插入的分析LinkedList
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I25154-5.jpg)
文章插图
从中,我们可以看出:通过add(int index, E element)向LinkedList插入元素时 。先是在双向链表中找到要插入节点的位置index;找到之后,再插入一个新节点 。
双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找 。
ArrayList
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I2L96-6.jpg)
文章插图
【JAVA中ArrayList、LinkedList、Vector、Stack的比较】在这里面有一个非常耗时的操作
System.arraycopy(elementData, index, elementData, index + 1, size - index);
该方法被标记了native,调用了系统的C/C++代码,在JDK中是看不到的,但在openJDK中可以看到其源码 。
该函数实际上最终调用了C语言的memmove()函数,因此它可以保证同一个数组内元素的正确复制和移动,比一般的复制方法的实现效率要高很多,很适合用来批量处理数组 。JAVA强烈推荐在复制大量数组元素时用该方法,以取得更高的效率 。
Vector
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I2O32-7.jpg)
文章插图
可以看到Vector和ArrayList是一样的,都调用了System.arraycopy 。由于Stack和继承与Vector,就不仔细分析了 。
四、查找的分析LinkedList
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I21U6-8.jpg)
文章插图
从中,我们可以看出:通过get(int index)获取LinkedList第index个元素时 。先是在双向链表中找到要index位置的元素;找到之后再返回 。
双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找 。
ArrayList
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I24042-9.jpg)
文章插图
我们可以看到ArrayList直接返回数组中index位置的元素,而不需要像LinkedList一样进行查找 。
通过源码发现Vector和Stack的操作方式和ArrayList一样,这里就不详细分析了 。
五、删除的分析LinkedList
![JAVA中ArrayList、LinkedList、Vector、Stack的比较](http://img.jiangsulong.com/220408/102I21238-10.jpg)
文章插图
由于删除了某一节点因此调整相应节点的前后指针信息,如下:
e.previous.next = e.next;//预删除节点的前一节点的后指针指向预删除节点的后一个节点 。e.next.previous = e.previous;//预删除节点的后一节点的前指针指向预删除节点的前一个节点 。
推荐阅读
- 中国古代宝藏 在一件件国宝中触摸文化的宝藏
- 国都证券|面试中的奇葩事
- 中国茶商大会获评浙江省最具影响力十大农事节庆
- 山国饮艺 做最受尊敬中国茶
- 节节清茶业员工博饼庆中秋
- 分流|中考分流发展职教,职校毕业生却不愿进厂,这道难题怎么解?
- 福州中秋礼品市场,轻巧礼品成主流
- 中华茶文化之歌
- 晓阳春,温情茶礼迎中秋
- 时尚版中国茶 老古董的奢华