ArrayList和LinkedList性能比较

2024-06-15 01:08

本文主要是介绍ArrayList和LinkedList性能比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ArrayList的本质上是一个数组,可以通过索引直接访问元素.
LinkedList的本质上是一个链表,链表是无法通过索引直接访问的,LinkedList通过索引访问属于间接访问,也就是通过遍历来获取索引处的值,因此其效率相对较低,下面通过代码进行测试.

添加,查找,删除测试

添加
//添加元素比较
//ArrayList
ArrayList<Integer> arrayList =  new ArrayList<Integer>();       
System.out.println("添加元素测试");startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {arrayList.add(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList添加10 0000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayList
LinkedList<Integer> linkedList =  new LinkedList<Integer>();        
startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {linkedList.add(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList添加10 0000个元素所用时间:" + (endTime-startTime) + "ms");

输出

添加元素测试
ArrayList添加10 0000个元素所用时间:11ms
LinkedList添加10 0000个元素所用时间:44ms

从结果上看,由于LinkedList添加元素时需要管理next和first的指向,因此效率会高一点.ArrayList可使用索引直接访问,效率很高.

查找
//查找元素比较
//ArrayListSystem.out.println("查找元素测试");startTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {arrayList.get(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList查找10 0000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayListstartTime = new Date().getTime();
for(int i = 0 ;i < 100000 ;i++) {linkedList.get(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList查找10 0000个元素所用时间:" + (endTime-startTime) + "ms");

输出

查找元素测试
ArrayList查找10 0000个元素所用时间:1ms
LinkedList查找10 0000个元素所用时间:5157ms

由于使用索引进行查找时,LinkedList需要进行遍历获取索引位置,因此效率非常的慢.

删除
//删除元素比较
//ArrayListSystem.out.println("删除元素测试");
System.out.println("arrayList.size = " + arrayList.size() + "   linkedList.size = " + linkedList.size());
startTime = new Date().getTime();
for(int i = 0 ;i < 10000 ;i++) {arrayList.remove(i);
}
endTime = new Date().getTime();
System.out.println("ArrayList删除10 000个元素所用时间:" + (endTime-startTime) + "ms");
//ArrayListstartTime = new Date().getTime();
for(int i = 0 ;i < 10000 ;i++) {
linkedList.remove(i);
}
endTime = new Date().getTime();
System.out.println("LinkedList删除10 000个元素所用时间:" + (endTime-startTime) + "ms");

输出

删除元素测试
arrayList.size = 100000   linkedList.size = 100000
ArrayList删除10 000个元素所用时间:254ms
LinkedList删除10 000个元素所用时间:155ms

由于ArrayList本质上是数组,因此删除元素时该元素后面的元素都要进行移动,
而LinkedList先是定位元素位置,然后管理next和prev指向即可.而且ArrayList的删除操作随着数据量增大而操作时间有明显的提高.因此删除的效率ArrayList是非常低的

操作ArrayListLinkedList数据量备注
添加14 ms36ms5 0000for(int i = 0 ;i < maxCount ;i++)末尾添加
添加23 ms31ms10 0000for(int i = 0 ;i < maxCount ;i++)末尾添加
添加300 ms8ms5 0000for(int i = 0 ;i < maxCount ;i++)开头添加
添加1035 ms18ms10 0000for(int i = 0 ;i < maxCount ;i++)开头添加
查找1123295 0000for(int i = 0 ;i < maxCount ;i++)
查找11555710 0000for(int i = 0 ;i < maxCount ;i++)
查找685 0000for(Integer item:arrayList)
查找11910 0000for(Integer item:arrayList)
查找445 0000迭代器while (linkedListIterator.hasNext())
查找11810 00000迭代器while (linkedListIterator.hasNext())
删除27775 0000for(int i = 0 ;i < maxCount ;i++) 移除索引0
删除10431010 0000for(int i = 0 ;i < maxCount ;i++)移除索引0

对于添加元素,如果对元素顺序没有要求,两者的效率并不差多少;
对于查找元素,如果使用for循环,那么LinkedList的效率将会非常的差,但使用迭代器访问,那么相差不大.
对于删除元素.由于需要移动元素ArrayList的效率也会很差.

因此如果应用中查找比较多,建议使用ArrayList;
如果应用中删除比较多,建议使用LinkList;

相关文章

JDK9.0 ArrayList源码阅读记录
JDK9.0 LinkedList源码阅读记录
ArrayList和LinkedList性能比较
JDK9.0 Vector源码阅读记录
JDK9.0 Hashtable源码阅读记录
Java9.0 HashMap源码阅读记录
JDK9.0 HashSet源码阅读记录

这篇关于ArrayList和LinkedList性能比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062007

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正在不断推陈出新,推出具有更低时延和更高 IOPS 性能的云硬盘产品。 8 月 22 日 2024 DTCC 大会上(第十五届中国数据库技术大会),XSKY星辰天合正式公布了基于星

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL