当前位置: 首页 > news >正文

【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(非哦谁斯):当进行遍历时,运行运行其他线程对集合进行修改,只不过会牺牲部分一致性
  1. ArrayList使用的就是FailFast 策略执行遍历的;

    1. ArrayList再执行迭代时,迭代器对象会先记录集合的修改次数,然后去执行,迭代方法next(),然后再执行next()迭代方法时会先对比较迭代前的集合的修改次数和现在的修改次数是否相同,如果相同,则继续执行迭代;当不相同时,表示集合在迭代时,被修改过,则会抛出异常
  2. CopyOnWriteArrayList (科批安外)使用的则是FailSafe策略执行遍历,再遍历时,允许其他线程进行修改

    1. 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…...

LangGraph 持久化深度解析:Checkpoint 机制如何实现对话记忆和断点续跑

很多同学在第一次接入 LangGraph 时,会发现图默认是「无状态」的——每次 invoke,上一轮的消息就消失了。你以为加了 MessagesState 就有记忆了,结果测试一问,Agent 完全不知道「你叫什么名字」。 更惨的是什么?生产环…...

Go语言安全编码实践:常见漏洞与防护

Go语言安全编码实践:常见漏洞与防护 1. 安全编码原则 安全编码是防止漏洞的根本,包括输入验证、输出编码、最小权限等原则。 2. 安全工具 package securityimport ("regexp""strings" )type Validator struct {emailRegex *regexp.R…...

离线语音识别性能提升:Vosk API的3大架构优化策略实践

离线语音识别性能提升:Vosk API的3大架构优化策略实践 【免费下载链接】vosk-api Offline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node 项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api …...

Python 爬虫数据处理:特殊格式文档爬虫解析处理

前言 在 Python 爬虫规模化采集业务中,除常规 HTML 网页与 JSON 接口数据外,经常会遇到各类非网页型特殊格式文档资源,常见包含 PDF、Word、Excel、CSV、TXT、压缩包内嵌文档、Base64 加密文档、富文本混合格式文档等。这类文档无法通过常规…...

Acrylic Paint风格在Midjourney中失效的5大隐性陷阱(附官方未公开的--s 700+--style raw协同调参公式)

更多请点击: https://intelliparadigm.com 第一章:Acrylic Paint风格在Midjourney中的本质定义与失效现象全景图 Acrylic Paint(丙烯画)风格在Midjourney中并非原生语义标签,而是一种通过视觉特征逆向建模的提示工程产…...

2026年国民技术数字IC笔试试卷带答案

满分:100分 时间:90分钟 一、单选题(每题3分,共30分) 1. 在静态时序分析(STA)中,建立时间检查的公式为( ) A. Tclk + Tskew ≥ Tck-q + Tlogic + Tsetup B. Tclk - Tskew ≥ Tck-q + Tlogic + Tsetup C. Tclk ≥ Tck-q + Tlogic - Tsetup D. Tlogic ≥ Tsetup + Tho…...

AXI协议深度解析:从握手到低功耗,一次搞懂芯片内部数据流的那些“潜规则”

AXI协议深度解析:从握手到低功耗,一次搞懂芯片内部数据流的那些“潜规则” 在当今高性能计算和复杂SoC设计中,AXI协议已成为连接处理器、存储器和外设的黄金标准。但真正理解AXI的精髓,远不止于掌握基础操作——那些隐藏在规范字里…...

从零到精通:AI大模型学习路线图,手把手带你入门!

本文提供了一条从基础到高级的AI大模型学习路线图,涵盖数学与编程基础、机器学习入门、深度学习实践、大模型探索以及进阶应用等方面。文章推荐了丰富的学习资源,包括经典书籍、在线课程、实践项目和开源平台,旨在帮助新手小白系统学习AI大模…...

Claude长文档推理能力跃迁全记录(2024–2026技术演进图谱)

更多请点击: https://intelliparadigm.com 第一章:Claude 2026长文档推理能力的定义与边界 Claude 2026 的长文档推理能力指其在单次上下文窗口内(最大支持 2,000,000 tokens)对跨章节、多模态混合结构化文本(含嵌入表…...

深度学习对抗性攻击与防御:从FGSM到对抗训练的技术全景

1. 项目概述:当深度学习模型遭遇“精心设计的噪声”在图像识别、自动驾驶、金融风控等关键领域,深度学习模型正扮演着越来越核心的角色。我们通常关注的是模型的准确率、召回率这些“正面战场”上的表现,但一个容易被忽视的致命问题是&#x…...