List集合详解
目录
1、集合是什么?
1.1、集合与集合之间的关系
2、List集合的特点
3、遍历集合的三种方式
3.1、foreach(增强佛如循环遍历)
3.2、for循环遍历
3.3、迭代器遍历
4、LinkedList和ArrayList的区别
4.1、为什么ArrayList查询会快一些?
4.2、为什么LinkedList查询会慢一些?
4.3总结--面试常问:
4.3.1、为什么linkedList查询会比Arraylist查询慢?
4.3.2、linkedlist集合和arraylist集合的区别
5、List调优:
5.1、集合的底层
5.2、ArrayList集合的动态扩容机制
5.2.1、触发扩容机制的条件
5.2.2、扩容的流程
5.3、如何进行性能调优呢?--面试常问
6、list集合底层对象去重原理
6.1、流程:
1、集合是什么?
1、简单来说,集合就是一个存放数据的容器,并且可以对存储的内容进行增删改查
2、集合的类型主要有三种
- list集合
- set集合
- map集合
1.1、集合与集合之间的关系

2、List集合的特点
1、有序
2、可以重复
3、具备容器的基本特点,可以进行增删改查
3、遍历集合的三种方式
3.1、foreach(增强佛如循环遍历)
- // foreach(增强for循环)
- for (Object object : list) {
- System.out.println(object);
- }
3.2、for循环遍历
- // for循环遍历
-
- for (int i = 0; i < list.size(); i++) {
- System.out.println(list.get(i));
- }
3.3、迭代器遍历
- // 迭代器
- Iterator iterator = list.iterator();
- while (iterator.hasNext()) {
- System.out.println(iterator.next());
- }
4、LinkedList和ArrayList的区别
-
LinkedList的特点:修改查询慢,新增删除快
-
arraylist集合的特点:修改查询快,新增删除慢
为什么新增删除ArrayList会慢些?

4.1、为什么ArrayList查询会快一些?
ArrayList 是基于数组实现的动态数组,它支持随机访问,可以根据元素的下标快速访问对应元素。具体来说,它内部维护了一个数组,通过索引访问数组元素的时间复杂度为 O(1)。因此 ArrayList 最适合读操作比较频繁的场景。

ArrayList从原理上就是数据结构中的数组,也就是内存中一片连续的空间,这意味着,当我
get(index)的时候,我可以根据数组的(首地址+偏移量),直接计算出我想访问的第index个元素在内存中的位置。
4.2、为什么LinkedList查询会慢一些?
LinkedList 是基于链表实现的,它是一个双向链表,每个节点都有指向前驱节点和后继节点的引用
LinkedList 不支持随机访问,因为它是基于链表数据结构实现的,而链表与数组不同,没有类似于数组的下标操作。
在链表中,每个元素通过指针连接到下一个元素,因此查询链表中的某个元素时,需要从链表的头部或尾部开始遍历,逐个比较元素的值,直到找到所需的元素。
这样的查询方式,与使用数组下标直接查找元素相比,时间复杂度要高很多

4.3总结--面试常问:
4.3.1、为什么linkedList查询会比Arraylist查询慢?
答:首先呢,arraylist他的底层的数据结构呢是一个数组,因为是数组,我们就可以直接的使用数组的get(index)方法直接的获取到数组中的元素,不需要进行遍历就可以拿到数组中的元素,但是linkedlist呢它的底层数据结构是一个双向的链表,而链表结构无法和数组一样通过get(index)直接获取到元素,只能够通过遍历去挨个查找,但是这样不仅使用了更多的资源以及更多的时间,虽然 LinkedList 不支持随机访问,但是它提供了一些查询元素的方法,比如 getFirst()、getLast()、indexOf()、lastIndexOf(),它们会沿着链表进行查询,直到找到对应的元素或者到达链表的末尾。
4.3.2、linkedlist集合和arraylist集合的区别
答:首先这两个集合的最本质上的区别就是两者的底层的数据结构是不同的,而数据结构的不同从而也导致了,两者增删改查效率的一些不同,首先arraylist集合它的特点就是,查询修改快,新增删除慢,因为是数组结构嘛,所以导致了只要在一个指定位置一移除或者增加了一条数据,那么整个数组这条数据后面的所有的数据都会进行移动,是非常耗费资源的,但是linkedlist呢他的底层就是一个链表结构,这种结构有个好处,就是移除了集合中的某个元素只需要改变那个元素的前驱节点和后继节点的指向就可以了,所以效率非常的快
查询的话我就不讲了刚刚问过了🤭
5、List调优:
5.1、集合的底层
集合的底层是什么呢?:答案是数组
那么为什么明明数组的长度是不可变的,但是集合就可以呢?
这里就涉及到了集合的动态数组扩容机制
5.2、ArrayList集合的动态扩容机制
5.2.1、触发扩容机制的条件
首先arraylist刚开始的默认长度为10,当往数组里添加内容的时候,当添加的数据长度达到10时,arraylist就会出发扩容机制
5.2.2、扩容的流程
首先创建一个新的数组,这个新数组的长度是原来数组的1.5倍,然后再使用arrays.copyof()的方法将老数组中的数据复制到新的数组之中 扩容完后,再将新的数据添加到新的数组之中去
5.3、如何进行性能调优呢?--面试常问
选择合适的容器:不同的场景下需要使用不同的容器。如前所述,ArrayList 适用于读取操作比较多的场景,而 LinkedList 适用于插入和删除频繁的场景。在选择容器时,需要根据实际情况进行权衡和选择。
指定初始值:在创建 ArrayList 容器时,可以指定其大小,避免频繁调整数组大小带来的性能损耗。在实际应用中,往往需要根据数据量的大小进行估算。如果确实无法估算,可以使用默认大小的初始化方法,不过记得为容器预留出一些空间,以便能够加载新元素。
尽量减少扩容操作:扩容是比较耗时的操作,可以尝试通过预估所需容量来预先分配更多的容量,以减少扩容的次数。在进行大量元素添加操作时,可以使用 addAll(Collection<? extends E> c) 方法,将多个元素一同添加到 List 容器中,以避免使用 add(E e) 方法频繁进行扩容操作。
避免频繁的查询操作:除了 ArrayList 支持随机访问以外,其他容器需要进行遍历操作才可以得到元素。在进行查询操作时,需要尽量避免频繁的遍历操作,可以使用相应的查询方法,如 getFirst()、getLast()、indexOf()、lastIndexOf() 等。如果确实需要进行遍历操作,可以考虑使用 ListIterator 接口,以进行快速的遍历和查询。
6、list集合底层对象去重原理
6.1、流程:
遍历老集合,将集合中的每一条数据进行比较,如果新的集合中不包含条件中的数据,那么就将其放到新数组中去,看代码!
public static void main(String[] args) { List list= new ArrayList(); list.add(new Student(1,"23")); list.add(new Student(2,"23")); List list1= new ArrayList(); //遍历老集合中的元素 for (Object obj : list) { //如果新集合中不包含此元素,就将其加入到新集合中,最后输出新集合 if(!list1.contains(obj)) { list1.add(obj); } } }
但是此时有个问题,这样子判断真的可以吗?答案是不行的
如果老集合中的数据是基本类型,那应该可以
但是如果是引用类型,就必须重写eqluas方法。为什么?
因为如果不进行重写,那么条件中进行判断的就是内存地址了,如果重写了,就是真正的比较值了,所以List去重复是根据重写的equals方法来的
注:过几天具体写一下ArrayList的扩容机制以及LinkedList如何去创建一个堆栈容器,还搞得不是很懂😶🌫️
相关文章:
List集合详解
目录 1、集合是什么? 1.1、集合与集合之间的关系 2、List集合的特点 3、遍历集合的三种方式 3.1、foreach(增强佛如循环遍历) 3.2、for循环遍历 3.3、迭代器遍历 4、LinkedList和ArrayList的区别 4.1、为什么ArrayList查询会快一些? 4.2、为什么LinkedLi…...
投稿指南【NO.12_8】【极易投中】核心期刊投稿(组合机床与自动化加工技术)
近期有不少同学咨询投稿期刊的问题,大部分院校的研究生都有发学术论文的要求,少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业,但是核心期刊要求论文质量高且审稿周期长,所以本博客梳理一些计算机特别是人工智能相关的期…...
解决git无法上传大文件(50MB)
解决方法 使用LFS解决GitHub无法上传大于50MB的文件 LFS简介 Git LFS(Large File Storage)是 Git 的一个扩展,用于管理大型文件,如二进制文件、图像、音频和视频文件等。它的主要目的是解决 Git 对大型二进制文件的版本控制和存…...
用递归实现字符串逆序(不使用库函数)
文章目录 前言一、题目要求二、解题步骤1.大概框架2.如何反向排列?3.模拟实现strlen4.实现反向排列5.递归实现反向排列 总结 前言 嗨,亲爱的读者们!我是艾老虎尤,今天,我们将探索一个题目,这个题目对新手非…...
初学python(一)
一、python的背景和前景 二、 python的一些小事项 1、在Java、C中,2 / 3 0,也就是整数 / 整数 整数,会把小数部分舍掉。而在python中2 / 3 0.66666.... 不会舍掉小数部分。 在编程语言中,浮点数遵循IEEE754标准,不…...
Excel VSTO开发8 -相关控件
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 8 相关控件 在VSTO开发中,Ribbon(或称为Ribbon UI)是指Office应用程序中的那个位于顶部的带有选…...
华为数据管理——《华为数据之道》
数据分析与开发 元数据是描述数据的数据,用于打破业务和IT之间的语言障碍,帮助业务更好地理解数据。 元数据是数据中台的重要的基础设施,元数据治理贯彻数据产生、加工、消费的全过程,沉淀了数据资产,搭建了技术和业务…...
Flink CDC 菜鸟教程 -环境篇
本教程将介绍如何使用 Flink CDC 来实现这个需求, 在 Flink SQL CLI 中进行,只涉及 SQL,无需一行 Java/Scala 代码,也无需安装 IDE。 系统的整体架构如下图所示: 环境篇 1、 准备一台Linux 2、准备教程所需要的组件 下载 flink-1.13.2 并将其解压至目录 flink-1.13.2 …...
【线上问题】linux部署docker应用docker-compose启动报端口占用问题(感觉上没有被占用)
目录 一、问题说明二、排查过程 一、问题说明 1.linux服务器使用的不是root用户权限 2.docker应用服务没有关闭的情况下,做了些重装docker,重启docker等操作 3.docker-compose up -d然后docker logs查看日志报端口被占用 4.netstat -ntpl | grep 端口 也…...
解决虚拟机克隆后IP和命名冲突问题
目录 解决IP冲突问题 解决命名冲突 解决IP冲突问题 克隆后的虚拟机和硬件地址和ip和我们原虚拟机的相同,我们需要重新生成硬件地址和定义ip,步骤如下: (1)进入 /etc/sysconfig/network-scripts/ifcfg-ens33 配置文件…...
分享一个python基于数据可视化的智慧社区服务平台源码
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、Node.js、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! …...
[密码学入门]凯撒密码
单表代换 单表:英文26字母的顺序 代换:替换为别的字母并保证解密的唯一性 假如我们让加密方式为所有字母顺序移动3位 import stringstring.ascii_lowercase abcdefghijklmnopqrstuvwxyz b3 加密算法y(xb)mod26 解密算法为x(y-b)mod26 密钥空间26 …...
博客之QQ登录功能(一)
流程图 上图spring social 封装了1-8步需要的工作 1、新建包和书写配置文件 public class QQProperties {//App唯一标 识private String appId "100550231";private String appSecret "69b6ab57b22f3c2fe6a6149274e3295e";//QQ供应商private String…...
Redis多机数据库实现
Redis多机数据库实现 为《Redis设计与实现》笔记 复制 客户端可以使用SLAVEOF命令将指定服务器设置为该服务器的主服务器 127.0.0.1:12345> SLAVEOF 127.0.0.1 6379127.0.0.1:6379将被设置为127.0.0.1:123456的主服务器 旧版复制功能的实现 Redis的复制功能分为同步&a…...
Leangoo领歌 -敏捷任务管理软件,任务管理更轻松更透明
任务管理,简单易懂,就是对任务进行管理。那怎么可以更好进行任务管理呢?怎么样样可以让任务进度可视化,一目了然呢?有效的管理可以让我们事半功倍。 接下来我们看一下如何借助任务管理软件高效的做任务管理。 首先…...
go的iris框架进行本地资源映射到服务端
我这里使用的是HandleDirapi,有其他的请补充 package mainimport ("github.com/kataras/iris/v12" )type Hello struct{Status int json:"status"Message string json:"message" }func main(){app : iris.New()//第一个api:相当于首页app.Get(&q…...
代码随想录day46|139. 单词拆分
139. 单词拆分 class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:dp [False]*(len(s)1)dp[0]Truefor i in range(len(s)1):for j in wordDict:if i>len(j) and (s[i-len(j):i] in wordDict) and dp[i-len(j)]:dp[i] Truereturn dp[len(s)]多…...
MATLAB实现函数拟合
目录 一.理论知识 1.拟合与插值的区别 2.几何意义 3.误差分析 二.操作实现 1.数据准备 2.使用cftool——拟合工具箱 三.函数拟合典例 四.代码扩展 一.理论知识 1.拟合与插值的区别 通俗的说,插值的本质是根据现有离散点的信息创建出更多的离散点…...
vue优化首屏加载时间优化-cdn引入第三方包
前言 为什么要进行首屏加载优化,因为随着我们静态资源和第三方包和代码增加,压缩之后包会越来越大 随着网络的影响,在我们第一输入url请求资源时候,网络阻塞,加载时间长,用户体验不好 仔细观察后就会发现…...
lv4 嵌入式开发-3 标准IO的读写
目录 1 标准I/O – 读写流 2 标准I/O – 按字符输入 3 标准I/O – 按字符输出 4 标准I/O – 思考和练习 5 标准I/O – 按行输入 6 标准I/O – 按行输出 7 标准I/O – 思考和练习 1 标准I/O – 读写流 流支持不同的读写方式: 读写一个字符:fgetc()/fputc()一…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
