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

相关文章

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Java慢查询排查与性能调优完整实战指南

《Java慢查询排查与性能调优完整实战指南》Java调优是一个广泛的话题,它涵盖了代码优化、内存管理、并发处理等多个方面,:本文主要介绍Java慢查询排查与性能调优的相关资料,文中通过代码介绍的非... 目录1. 事故全景:从告警到定位1.1 事故时间线1.2 关键指标异常1.3 排查工具链2. 深度剖析:

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤