【2023】ArrayList和LinkedList详解介绍对比
一、ArrayList
1、概述
ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。
每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。默认初始容量是10。默认初始容量为10。随着ArrayList中元素的增加,它的容量也会不断的自动增长。在每次添加元素时,ArrayList都会检查是否需要进行扩容操作,扩容操作带来数据向新数组的重新拷贝,所以如果我们知道具体业务数据量,在构造ArrayList时,可以给ArrayList 指定一个初始容量,这样就会减少扩容时的拷贝问题。当然在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
ArrayList基本参数:
grow() : 扩容方法
扩容规则
- new ArrayList(),的初始容量是0;
- new ArrayList(int initialCapacity),会使用指定容量的数组
- new ArrayList(Collection c),则会使用这个集合c的大小作为容量;
- add(Object o):一个一个添加元素
- 当第一次add时,会首次扩容到10;然后把元素加到传递为10的数值中,当元素个数大于10时,会进行继续扩容;
- 后面每一次扩容后的容量都会是原来数组的1.5倍;使用的计算方式:是原来的长度右移一位得到原来的一半再加上原来的长度 ( 10 > > 1 + 10 ) = 15 (10>>1 + 10)=15 (10>>1+10)=15
- 前10次扩容:[0,10,15,22,33,49,73,109,163,224]
- addAll(Collection c):添加集合元素
- 当使用addAll添加集合元素,会对下次扩容的容量和实际的元素个数之间选一个较大的数作为扩容后的容量,
迭代器(Iterator):FailFast VS failSafe
- FailFast (非哦发斯):当进行遍历时,不允许其他线程对集合来进行修改,会直接抛出异常
- FailSafe(非哦谁斯):当进行遍历时,运行运行其他线程对集合进行修改,只不过会牺牲部分一致性
-
ArrayList使用的就是FailFast 策略执行遍历的;
- ArrayList再执行迭代时,迭代器对象会先记录集合的修改次数,然后去执行,迭代方法next(),然后再执行next()迭代方法时会先对比较迭代前的集合的修改次数和现在的修改次数是否相同,如果相同,则继续执行迭代;当不相同时,表示集合在迭代时,被修改过,则会抛出异常
-
CopyOnWriteArrayList (科批安外)使用的则是FailSafe策略执行遍历,再遍历时,允许其他线程进行修改
- CopyOnWriteArrayList 再执行迭代时,使用的是读写分离的方式,在执行add方法添加元素时,不是直接添加在原来的数组里,而是在把原来的数组复制了一个新的数组,且长度在原来的基础上+1,添加的这个元素就放在了复制的数值扩容的那一个位置中,所以压根不会影响到迭代器遍历;只不过是牺牲了一致性,迭代时,读取不到这个新添加的元素而已。
ArrayList和LinkedList的区别
-
ArrayList
- 基于数组,需要连续内存
- 随机访问快(指根据下标访问),因为ArrayList的数据结构是数组,在内存中存储是连续的,随机访问时,就可以根据下标通过简单的运算得到想要寻找的元素。ArrayList也通过继承了RandomAccess接口,作为标识,让jdk在执行时,会采用下标的方式去寻找。而LinkedList则没继承
- 尾部插入、删除性能可以,其他部分插入、删除都会移动数据,因此性能会比较低,
- 可以利用cpu缓存,局部性原理,因为ArrayList基于数组,所以在内存中存储是连续的,就可以很好的利用cpu缓存;
- 因为cpu缓存是具有局部性原理的;cpu每次在读取内存的数据时,会把它缓存在cpu缓存中,这样就可以避免每次都直接到内存中去读取数据,可以有效的提高效率,
- 而cpu的局部性原理则是,它每次到内存读取数据时,会顺带把你需要读取的数据的周边的数据也一并读到缓存中。因为cpu会觉得你有很大的概率会读取周边的数据。而数组刚好内存存储就是连续的,所以就可以有效的利用到这一点,减少直接到内存中去读取的次数。
- 而LinkedList则没法很好的利用这一点,因为它在内存中数据存储不是连续的,所以在读取时,没法有效的把接近的数据存储到CPU缓存中。
-
LinkedList
- 基于链表,内存存储不是连续的
- 随机访问较慢,因为内存存储不是连续的,没法通过下标计算找到想要寻找的元素,所以在查找时,需要通过链表一个一个去遍历,才能找到,需要寻找的元素
- 头尾插入删除性能较高,而中间位置的插入删除,非常慢,因为插入需要先执行查询,找到指定的位置,然后再去执行添加,而LinkedList执行查询的效率非常的慢,综合下来,再中间部分执行插入时,效率反而会比ArrayList慢很多
- 占用内存比较多,因为LinkedList是由一个一个的Node对象组成,每个Node对象中又存储了头节点和尾节点和数据,所以先对于ArrayList的内存占用会高很多
相关文章:
【2023】ArrayList和LinkedList详解介绍对比
一、ArrayList 1、概述 ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。 …...
【软件工程】基于领域建模的产品与技术方案设计(领域驱动设计DDD)
文章目录 1、领域建模2、产品方案、技术方案3、领域驱动设计DDD 1、领域建模 领域模型(domain model) 是对领域内的概念类或现实世界中对象的可视化表示。领域模型也成为概念模型、领域对象模型和分析对象模型。域模型是一种概念模型,也叫问题域模型。它表述的是某…...
跨境电商账号频繁?你的IP可能“不干净”了
疫情促进了跨境电商行业的加速发展,许多卖家也抓住了这波流量红利,跨境电商月入数万,数十万甚至数百万的造福神话也不断在上演,但由于国内外电商运营模式不同,多店运营、用户数据收集、刷单等行为都受到了国外平台的严…...
Docker数据卷与拦截与目录拦截
目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中,数据卷挂载和目录挂载是两种常见的挂载方式&…...
Python 元类 metaclass 详解
元类(metaclass)是 Python 中一个高级且相对较少使用的概念。元类可以被视为类的类,它控制类的创建过程。 一、基本概念 在 Python 中,一切皆对象。为了避免混淆,我们约定两个术语: 类实例:当…...
HCIA基础知识
IP地址、静态路由、动态路由、交换机 OSPF RIP DHCP VLAN ACL NAT OSI TCP/IP UDP TCP 三次握手,四次挥手,报头 什么是网络? 由网络连接设备通过传输介质将网络终端设备连接起来,进行资源共享、信息传递的平台。 OSI七…...
翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四
Streamlit从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三 1. 5. 如何部署一个Streamlit应用 部署是将应用程序从开发…...
AI时代Python量化交易实战:ChatGPT引领新时代
文章目录 《AI时代Python量化交易实战:ChatGPT让量化交易插上翅膀》关键点内容简介作者简介购买链接 《AI时代架构师修炼之道:ChatGPT让架构师插上翅膀》关键点内容简介作者简介 赠书活动 《AI时代Python量化交易实战:ChatGPT让量化交易插上翅…...
国科大软件安全原理期末复习笔记
1 软件安全总论 1.软件的三大特性:复杂性、互连性、可扩展性; 2.基本概念:缺陷、漏洞、风险 缺陷(bug):软件在设计和实现上的错误;漏洞(vulnerability):漏洞…...
人工智能软件测试2024年主要趋势
人工智能软件测试领域在未来可能面临多个发展趋势,其中一些趋势可能会对测试方法、工具和流程产生深远的影响。以下是塑造人工智能软件测试未来的主要趋势: 自动化和自动学习测试:随着人工智能的发展,测试自动化将变得更加智能和自…...
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 懒汉式(Lazy Initialization): 双重检查锁定(Double-Checked Locking)…...
常见的反爬虫风控 | 验证码风控
一.前言 在当今信息技术迅速发展的背景下,网站和在线服务面临着日益增长的自动化访问威胁,这些大多来自于各类爬虫程序。这种大量的自动化访问不仅对网站的正常运行构成压力,还可能导致敏感数据的泄露,甚至被用于不正当竞争和恶意…...
ClickHouse(21)ClickHouse集成Kafka表引擎详细解析
文章目录 Kafka表集成引擎配置Kerberos 支持 虚拟列 资料分享参考文章 Kafka表集成引擎 此引擎与Apache Kafka结合使用。 Kafka 特性: 发布或者订阅数据流。容错存储机制。处理流数据。 老版Kafka集成表引擎参数格式: Kafka(kafka_broker_list, kaf…...
JSP-概念
一、引子 很多读者可能听过JSP,并且知道这是一门过时的技术了。在Spring,SpringBoot已经成为主流的今天,笔者为什么还要介绍JSP的相关内容呢?笔者常常提到一个概念:理解一门技术,要理解这个技术为什么产生…...
sqlite插入语句id自增列问题
sqlite给主键id设置AUTOINCREMENT自增在插入数据的时候报错table has x columns but x-1 values were supplied 为什么自增列要显示不提供,sqlite需要提供自增列table ResTools has 7 columns but 6 values were supplied SQL Statement:insert into ResTools values(管理系统w…...
C#,字符串匹配(模式搜索)AC(Aho Corasick)算法的源代码
Aho-Corasick算法简称AC算法,也称为AC自动机(Aho-Corasick)算法,1975年产生于贝尔实验室(The Bell Labs),是一种用于解决多模式字符串匹配的经典算法之一。 the Bell Lab 本文的运行效果: AC算法以模式树…...
【网络取证篇】Windows终端无法使用ping命令解决方法
【网络取证篇】Windows终端无法使用ping命令解决方法 以Ping命令为例,最近遇到ping命令无法使用的情况,很多情况都是操作系统"环境变量"被改变或没有正确配置导致—【蘇小沐】 目录 1、实验环境(一)无法ping命令 &a…...
electron+vue网页直接播放RTSP视频流?
目前大部分摄像头都支持RTSP协议,但是在浏览器限制,最新版的浏览器都不能直接播放RTSP协议,Electron 桌面应用是基于 Chromium 内核的,所以也不能直接播放RTSP,但是我们又有这个需求怎么办呢? 市场上的方案…...
【Delphi 基础知识 19】Assigned的用法
在Delphi中,Assigned 是一个用于检查指针是否已分配内存的函数。它通常用于检查对象或指针是否已经被分配内存,以避免在未分配内存的情况下引用或操作它。 以下是 Assigned 的一些用法示例: 检查对象是否已分配内存: varMyObject…...
多线程在编程中的重要性有什么?并以LabVIEW为例进行说明
多线程在编程中的重要性体现在以下几个方面: 并行处理: 多线程允许程序同时执行多个任务,这在现代多核心处理器上尤其重要。通过并行处理,可以显著提高程序的执行效率和响应速度。 资源利用最大化: 通过多线程&#x…...
告别PWM和ADC:手把手教你用Arduino解析汽车传感器SENT协议(附代码)
告别PWM和ADC:手把手教你用Arduino解析汽车传感器SENT协议(附代码) 在汽车电子领域,传感器数据的可靠传输一直是工程师们面临的挑战。传统的PWM和ADC方式虽然简单,但存在分辨率低、抗干扰能力弱等局限。而SENT协议作为…...
短视频智能获客系统完整版:支持抖音/快手/视频号,含管理后台+手机端
温馨提示:文末有资源获取方式短视频赛道越来越卷,光靠人工剪辑发布已经跟不上节奏了。最近把一套能同时管理多个平台账号的系统跑通了,整理一下核心功能,给有需要的朋友参考。一、多平台统一管理支持抖音、快手、视频号、小红书、…...
从图像模糊到语音识别:卷积在AI中的实战应用与Python代码示例
从图像模糊到语音识别:卷积在AI中的实战应用与Python代码示例 卷积运算在人工智能领域扮演着至关重要的角色,它不仅是计算机视觉和语音处理的基础,更是现代深度学习架构的核心组件。对于希望将理论知识转化为实际应用的开发者而言,…...
AI大模型智能体工具链,到底啥关系?一张图看懂AI食物链,从“买工具”到“雇员工”的生产力革命!
本文通过形象的比喻,将AI、大模型、工具链、智能体之间的关系类比为“灵魂到手脚”的食物链,阐述了AI作为终极愿景,大模型如同大脑,工具是四肢,智能体则是能独立完成任务的数字员工。文章指出,AI技术正推动…...
保姆级教程:在Linux(Ubuntu 20.04)上搞定Java 11 + JavaFX 11的完整配置流程
从零开始:Ubuntu 20.04下Java 11与JavaFX 11开发环境深度配置指南 在Linux系统上进行Java桌面应用开发,环境配置往往是新手面临的第一个挑战。不同于Windows或macOS的一键安装体验,Ubuntu上的JavaFX开发需要开发者对模块化系统、环境变量和依…...
高端地铁/轻轨门控系统控制器功率器件选型方案——高可靠、长寿命与安全驱动系统设计指南
随着城市轨道交通向智能化、高密度运营方向发展,高端地铁与轻轨的门控系统作为保障乘客安全与运营效率的关键执行单元,其驱动控制器的可靠性、响应速度及环境适应性要求极为严苛。功率开关器件作为驱动器的核心,直接决定了系统的开关损耗、热…...
别再手动改MTL了!一个Python脚本搞定ENVI打开Landsat8 Collection2 Level2数据
别再手动改MTL了!一个Python脚本搞定ENVI打开Landsat8 Collection2 Level2数据 遥感数据处理中,最令人头疼的莫过于遇到格式兼容性问题。最近在USGS下载的Landsat8 Collection2 Level2数据就给我带来了这样的困扰——ENVI竟然无法直接读取其MTL元数据文件…...
Visual C++运行库一键修复终极方案:告别DLL缺失与程序启动失败
Visual C运行库一键修复终极方案:告别DLL缺失与程序启动失败 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库是Windows系统运行C程序的…...
