您现在的位置是:亿华云 > 应用开发
Java中ArrayList、LinkedList、Vector、Stack的比较
亿华云2025-10-04 00:28:11【应用开发】2人已围观
简介一、介绍先回顾一下List的框架图由图中的继承关系,可以知道,ArrayList、LinkedList、Vector、Stack都是List的四个实现类。AbstractList是一个抽象类,它继承于
一、比较介绍
先回顾一下List的比较框架图

由图中的继承关系,可以知道,比较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)。
二、性能测试
在对ArrayList、LinkedList、Vector、Stack进行比较之前,我们先来对他们进行一个性能测试,结合源码和测试结果来对ArrayList、LinkedList、Vector、Stack进行详细的分析。源码下载


得到的结果如下

根据结果,可以很明显的看出ArrayList、LinkedList、Vector、Stack的性能有很大的区别。

读取:ArrayList > Vector > Stack > LinkedList
插入:LinkedList > Vector > ArrayList > Stack
删除:LinkedList > Vector > ArrayList > Stack
三、插入的分析
LinkedList

从中,我们可以看出:通过add(int index, E element)向LinkedList插入元素时。先是在双向链表中找到要插入节点的位置index;找到之后,再插入一个新节点。
双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找。
ArrayList

在这里面有一个非常耗时的操作
System.arraycopy(elementData, index, elementData, index + 1, size - index);
该方法被标记了native,调用了系统的C/C++代码,在JDK中是看不到的,但在openJDK中可以看到其源码。
该函数实际上最终调用了C语言的memmove()函数,云服务器提供商因此它可以保证同一个数组内元素的正确复制和移动,比一般的复制方法的实现效率要高很多,很适合用来批量处理数组。Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率。
Vector

可以看到Vector和ArrayList是一样的,都调用了System.arraycopy。由于Stack和继承与Vector,就不仔细分析了。
四、查找的分析
LinkedList

从中,我们可以看出:通过get(int index)获取LinkedList第index个元素时。先是在双向链表中找到要index位置的元素;找到之后再返回。
双向链表查找index位置的节点时,有一个加速动作:若index < 双向链表长度的1/2,则从前向后查找; 否则,从后向前查找。
ArrayList

我们可以看到ArrayList直接返回数组中index位置的元素,而不需要像LinkedList一样进行查找。
通过源码发现Vector和Stack的操作方式和ArrayList一样,这里就不详细分析了。
五、删除的分析
LinkedList

由于删除了某一节点因此调整相应节点的前后指针信息,如下:
e.previous.next = e.next;//预删除节点的前一节点的后指针指向预删除节点的后一个节点。 e.next.previous = e.previous;//预删除节点的后一节点的前指针指向预删除节点的前一个节点。清空预删除节点:
e.next = e.previous = null; e.element = null;交给gc完成资源回收,删除操作结束。
与ArrayList比较而言,LinkedList的删除动作不需要“移动”很多数据,从而效率更高。
ArrayList

恩,又是调用了System.arraycopy。
六、结论
操作ArrayListLinkedListVectorStack读取O(1)O(n)O(1)O(1)插入O(n)O(1)O(n)O(n)删除O(n)O(1)O(n)O(n)
ArrayList(实现动态数组),查询快(随意访问或顺序访问),增删慢。整体清空快,线程不同步(非线程安全)。数组长度是可变的百分之五十延长
LinkedList(实现链表),查询慢,增删快。
Vector(实现动态数组),都慢,被ArrayList替代。长度任意延长。线程安全(同步的类,函数都是synchronized)
Stack(实现堆栈)继承于Vector,先进后出。
所以,快速访问ArrayList,快速增删LinkedList,单线程都可以用,多线程只能用同步类Vector
很赞哦!(97)
上一篇: 域名和网址一样吗?域名和网址有什么区别?
下一篇: 什么样的邮箱才是安全的电子邮件地址?
相关文章
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- 新年新趋势:2021有哪些值得投资的域名类型?
- 今日头条Go建千亿级微服务的实践
- 利用GDAL实现栅格影像差值计算及Geoserver自动发布栅格影像
- 2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
- 双拼com域名资源几近枯竭,新手还能投资哪类域名?
- 云端迁移过程中的技术问题和解决思路
- 域名会被盗用吗?怎么预防域名被盗?
- 新手可以注册cc域名吗?cc域名有什么特点?
- Java3种IO模型,一次搞懂!