ArrayList还是LinkedList?使用不当性能差千倍
ArrayList是基于数组实现LinkedList是基于链表实现。ArrayList和LinkedList在新增、删除元素时LinkedList的效率要高于 ArrayList而在遍历的时候ArrayList的效率要高于LinkedList。ArrayList是如何实现的1.ArrayList实现类ArrayList实现了List接口继承了AbstractList抽象类底层是数组实现的并且实现了自增扩容数组大小。ArrayList还实现了Cloneable接口和Serializable接口所以他可以实现克隆和序列化。ArrayList还实现了RandomAccess接口。你可能对这个接口比较陌生不知道具体的用处。通过代码我们可以发现这个接口其实是一个空接口什么也没有实现那ArrayList为什么要去实现它呢其实RandomAccess接口是一个标志接口他标志着“只要实现该接口的List类都能实现快速随机访问”。public class ArrayListE extends AbstractListE implements ListE, RandomAccess, Cloneable, java.io.Serializable2.ArrayList属性ArrayList属性主要由数组长度size、对象数组elementData、初始化容量default_capacity等组成 其中初始化容量默认大小为10。//默认初始化容量 private static final int DEFAULT_CAPACITY 10; //对象数组 transient Object[] elementData; //数组长度 private int size;从ArrayList属性来看它没有被任何的多线程关键字修饰但elementData被关键字transient修饰了。transient关键字修饰该字段则表示该属性不会被序列化但ArrayList其实是实现了序列化接口这到底是怎么回事呢这还得从“ArrayList是基于数组实现“开始说起由于ArrayList的数组是基于动态扩增的所以并不是所有被分配的内存空间都存储了数据。如果采用外部序列化法实现数组的序列化会序列化整个数组。ArrayList为了避免这些没有存储数据的内存空间被序列化内部提供了两个私有方法writeObject以及readObject来自我完成序列化与反序列化从而在序列化与反序列化数组时节省了空间和时间。因此使用transient修饰数组是防止对象数组被其他外部方法序列化。3.ArrayList构造函数我们在初始化ArrayList时可以通过第一个构造函数合理指定数组初始大小这样有助于减少数组的扩容次数从而提高系统性能。4.ArrayList新增元素ArrayList新增元素的方法有两种一种是直接将元素加到数组的末尾另外一种是添加元素到任意位置。两个方法的相同之处是在添加元素之前都会先确认容量大小如果容量够大就不用进行扩容如果容量不够大就会按照原来数组的1.5倍大小进行扩容在扩容之后需要将数组复制到新分配的内存地址。我们在使用ArrayList进行新增、删除时经常被提醒“使用ArrayList做新增删除操作会影响效率”。那是不是ArrayList在大量新增元素的场景下效率就一定会变慢呢如果我们在初始化时就比较清楚存储数据的大小就可以在ArrayList初始化时指定数组容量大小并且在添加元素时只在数组末尾添加元素那么ArrayList在大量新增元素的场景下性能并不会变差反而比其他List集合的性能要好。5.ArrayList删除元素ArrayList的删除方法和添加任意位置元素的方法是有些相同的。ArrayList在每一次有效的删除元素操作之后都要进行数组的重组并且删除的元素位置越靠前数组重组的开销就越大。6.ArrayList遍历元素由于ArrayList是基于数组实现的所以在获取元素的时候是非常快捷的。LinkedList是如何实现的LinkedList是基于双向链表数据结构实现的LinkedList定义了一个Node结构Node结构中包含了3个部分元素内容item、前指针prev以及后指针next。在JDK1.7之后LinkedList做了很大的改动对链表进行了优化。链表的Entry结构换成了Node内部组成基本没有改变但LinkedList里面的header属性去掉了新增了一个Node结构的first属性和一个Node结构的last属性。这样做有以下几点好处first/last属性能更清晰地表达链表的链头和链尾概念first/last方式可以在初始化LinkedList的时候节省new一个Entryfirst/last方式最重要的性能优化是链头和链尾的插入删除操作更加快捷了。1.LinkedList实现类LinkedList类实现了List接口、Deque接口同时继承了AbstractSequentialList抽象类LinkedList既实现了List类型又有Queue类型的特点LinkedList也实现了Cloneable和Serializable接口同ArrayList一样可以实现克隆和序列化。由于LinkedList存储数据的内存地址是不连续的而是通过指针来定位不连续地址因此LinkedList不支持随机快速访问LinkedList也就不能实现RandomAccess接口。public class LinkedListE extends AbstractSequentialListE implements ListE, DequeE, Cloneable, java.io.Serializable2.LinkedList属性我们前面讲到了LinkedList的两个重要属性first/last属性其实还有一个size属性。我们可以看到这三个属性都被transient修饰了原因很简单我们在序列化的时候不会只对头尾进行序列化所以LinkedList也是自行实现readObject和writeObject进行序列化与反序列化。3.LinkedList新增元素LinkedList添加元素的实现很简洁但添加的方式却有很多种。默认的add (Ee)方法是将添加的元素加到队尾首先是将last元素置换到临时变量中生成一个新的Node节点对象然后将last引用指向新节点对象之前的last对象的前指针指向新节点对象。LinkedList也有添加元素到任意位置的方法如果我们是将元素添加到任意两个元素的中间位置添加元素操作只会改变前后元素的前后指针指针将会指向添加的新元素所以相比ArrayList的添加操作来说LinkedList的性能优势明显。4.LinkedList删除元素在LinkedList删除元素的操作中我们首先要通过循环找到要删除的元素如果要删除的位置处于List的前半段就从前往后找若其位置处于后半段就从后往前找。这样做的话无论要删除较为靠前或较为靠后的元素都是非常高效的但如果List拥有大量元素移除的元素又在List的中间段那效率相对来说会很低。5.LinkedList遍历元素LinkedList的获取元素操作实现跟LinkedList的删除元素操作基本类似通过分前后半段来循环查找到对应的元素。但是通过这种方式来查询元素是非常低效的特别是在for循环遍历的情况下每一次循环都会去遍历半个List。

相关新闻

基于WMSST结合MCNN-BiGRU的故障诊断研究附Matlab代码

基于WMSST结合MCNN-BiGRU的故障诊断研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/5/17 9:16:22 阅读更多 →
PC在线流程图制作工具 中文操作简单高效出图

PC在线流程图制作工具 中文操作简单高效出图

一、流程图绘制行业通用规范(开发者必看) 流程图是软件开发、业务梳理、系统设计中的标准化可视化文档,遵循统一规范是保障跨团队协作、文档可维护性的基础。当前行业通用标准为ISO 5807与GB/T 1526-1989,两类标准在符号定义、布…

2026/5/17 7:59:42 阅读更多 →
掌握大数据领域 OLAP 数据建模的核心要点

掌握大数据领域 OLAP 数据建模的核心要点

掌握大数据领域 OLAP 数据建模的核心要点关键词:OLAP、数据建模、星型模型、事实表、维度表、数据立方体、缓慢变化维度摘要:在大数据时代,企业决策越来越依赖数据驱动的分析。OLAP(联机分析处理)作为支持复杂查询和多…

2026/5/17 9:16:21 阅读更多 →

最新新闻

多字段自定义表单搭建设计:如何设计灵活、高效的数据采集系统?

多字段自定义表单搭建设计:如何设计灵活、高效的数据采集系统?

在企业数字化管理过程中,无论是客户信息登记、采购申请、设备巡检,还是项目管理、售后服务、质量检测,都离不开表单。然而,很多企业在搭建业务系统时会发现,标准表单往往无法满足实际需求:字段固定、扩展困…

2026/7/3 3:52:59 阅读更多 →
tech-DeepSeekAPI接入完整指南

tech-DeepSeekAPI接入完整指南

DeepSeek API 接入完整指南:从注册到第一个调用,5 个常见坑 这篇教程的范围 本文是 DeepSeek API 直接接入的官方教程。 如果您用第三方聚合平台(API2D/OpenRouter/聚合服务),流程类似但有差异,具体看平台文档。 目标读者: - ✅ 想直接用 DeepSeek 官方 - ✅ 有 Python 或 Node…

2026/7/3 3:52:59 阅读更多 →
如何设置静态IP

如何设置静态IP

静态 IP 是一种固定的 IP 地址,不会随着网络的重新连接或者 DHCP 服务器的分配而改变。与之相对,动态 IP 地址由 DHCP 服务器动态分配,每次设备重新连接到网络时都可能会分配不同的 IP 地址。静态 IP 通常用于需要固定 IP 地址的设备&#x…

2026/7/3 3:52:59 阅读更多 →
字段太多看不全,ksql 的展开模式和输出控制怎么用

字段太多看不全,ksql 的展开模式和输出控制怎么用

MySQL 里查宽表,字段多了输出就会折行,列对应关系容易看乱。MySQL 的解法是在 SQL 末尾加 \G,把每行的字段竖着列出来。ksql 里处理这个问题的方式不同——通过几个元命令控制整个会话的输出行为,不用每条 SQL 末尾单独加。 这篇在…

2026/7/3 3:50:58 阅读更多 →
抓包、TLS 指纹、UA 一致性分析工具

抓包、TLS 指纹、UA 一致性分析工具

TLSFOWARD:一款集抓包、TLS指纹分析与UA一致性验证于一体的专业工具 在接口调试、浏览器环境分析、爬虫环境排查以及测试排查等场景中,抓包是一项非常基础且常见的操作。 然而,仅仅查看 HTTP 请求往往是不够的。因为 User-Agent 可以被修改&a…

2026/7/3 3:48:58 阅读更多 →
继承、重载与多态

继承、重载与多态

继承是C中的一个重要特性&#xff0c;它可以让我们从一个类的部分成员继承并新建立一个类&#xff0c;class <派生类名> : <继承方式(public/protected/private)> <基类名>例如&#xff1a;//基类 class Animal{eat(); sleep(); }//派生类 class Dog : publi…

2026/7/3 3:46:58 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述&#xff1a;为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473&#xff0c;一个关于TLS/SSL协议重协商机制的漏洞&#xff0c;现在提起来还有必要吗&#xff1f;很多运维和开发朋友可能会觉得&#xff0c;这都老掉牙了&#xff0c;现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述&#xff1a;为什么需要双通道远程管理防火墙&#xff1f;在任何一个稍具规模的企业网络里&#xff0c;防火墙都是那个默默守护在边界的关键角色。作为网络工程师&#xff0c;我们不可能每次都跑到机房&#xff0c;插上console线去配置它。远程管理能力&#xff0c;…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述&#xff1a;AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域&#xff0c;同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件&#xff0c;与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻