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

Java集合List详解(带脑图)

允许重复元素,有序。常见的实现类有 ArrayListLinkedListVector

ArrayList

ArrayList 是在 Java 编程中常用的集合类之一,它提供了便捷的数组操作,并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素,或者需要在多线程环境中使用,可能需要考虑其他集合实现。

特点

1.动态大小: ArrayList 的大小是动态可变的,可以根据需要自动增加或缩小。这与 Vector 相似,但相对于 LinkedList,它的随机访问效率更高。

2.随机访问高效: 由于 ArrayList 基于动态数组实现,可以通过索引直接访问元素,因此在需要频繁随机访问元素的场景下,ArrayList 的性能通常优于 LinkedList

3.适用于大部分场景: 在大多数情况下,ArrayList 是一个通用、高效的集合类。它适用于存储和随机访问元素,但不适用于在中间或开头频繁插入和删除元素的情况。

4.非同步: ArrayList 不是线程安全的,不支持多线程并发操作。如果需要在多线程环境中使用,可以考虑使用 Vector(这个比较落后了,所以就不提了) 或使用 Collections.synchronizedList 方法包装 ArrayList

使用方法

首先先引用,然后初始化。

import java.util.ArrayList;//引入ArrayList类public class Test01 {ArrayList<String> objectName = new ArrayList<>();//初始化
}

objectName:对象名。

ArrayList<String>:这<>里面的是泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。

一点示范

import java.util.ArrayList;//引入ArrayList类public class Test01 {public static void main(String[] args) {ArrayList<String> objectName = new ArrayList<>();//初始化objectName.add("Changsha");//add()System.out.println(objectName);objectName.add("Shenyang");System.out.println(objectName);objectName.set(0,"Shanghai");//set()System.out.println(objectName);System.out.println(objectName.get(1));//get()objectName.remove(1);//remove()System.out.println(objectName);}
}

运行结果

用法表格

1add()将元素插入到指定位置的 arraylist 中
2addAll()添加集合中的所有元素到 arraylist 中
3clear()删除 arraylist 中的所有元素
4clone()复制一份 arraylist
5contains()判断元素是否在 arraylist
6get()通过索引值获取 arraylist 中的元素
7indexOf()返回 arraylist 中元素的索引值
8removeAll()删除存在于指定集合中的 arraylist 里的所有元素
9remove()删除 arraylist 里的单个元素
10size()返回 arraylist 里元素数量
11isEmpty()判断 arraylist 是否为空
12subList()截取部分 arraylist 的元素
13set()替换 arraylist 中指定索引的元素
14sort()对 arraylist 元素进行排序
15toArray()将 arraylist 转换为数组
16toString()将 arraylist 转换为字符串
17ensureCapacity()设置指定容量大小的 arraylist
18lastIndexOf()返回指定元素在 arraylist 中最后一次出现的位置
19retainAll()保留 arraylist 中在指定集合中也存在的那些元素
20containsAll()查看 arraylist 是否包含指定集合中的所有元素
21trimToSize()将 arraylist 中的容量调整为数组中的元素个数
22removeRange()删除 arraylist 中指定索引之间存在的元素
23replaceAll()将给定的操作内容替换掉数组中每一个元素
24removeIf()删除所有满足特定条件的 arraylist 元素
25forEach()遍历 arraylist 中每一个元素并执行特定操作

LinkedList

特点

1.双向链表结构:这是它与ArrayList最主要的差别, LinkedList 的底层数据结构是双向链表,每个节点都包含对前一个和后一个元素的引用。

2.动态大小: 类似于 ArrayListLinkedList 的大小也是动态可变的,可以根据需要自动增加或缩小。

3.插入和删除效率高: 由于链表结构,LinkedList 在中间插入和删除元素的操作比 ArrayList 效率更高。因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。

4.非随机访问效率相对较低:ArrayList 不同,LinkedList 的随机访问效率相对较低。如果需要频繁随机访问元素,ArrayList 可能更适合。

5.迭代效率: 在迭代时,LinkedList 的性能较差。由于访问节点需要跳跃指针,相比于数组的连续存储,会增加迭代的开销。

6.占用更多内存: 由于每个节点都需要存储额外的引用,相对于 ArrayListLinkedList 在内存占用上可能会更多。

7.非同步: LinkedList 也不是线程安全的,不支持多线程并发操作。如果需要在多线程环境中使用,可以考虑使用 Collections.synchronizedList 方法包装 LinkedList

8.特定场景的优势: 在某些特定的场景中,如实现栈、队列或双端队列等数据结构时,LinkedList 可能更为适用。

使用方法

同样是引用和初始化

import java.util.LinkedList;public class Test01 {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();}
}

linkedList:对象名

LinkedList<String>:这<>里面的是泛型数据类型,用于设置 linkedList的数据类型,只能为引用数据类型。

一些示范

import java.util.LinkedList;public class Test01 {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Apple");linkedList.add("Banana");linkedList.add("Orange");System.out.println(linkedList);
// 在指定位置插入元素linkedList.add(1, "Grapes");System.out.println(linkedList);//获取链表中的元素:String element = linkedList.get(0);System.out.println(element);//更新链表中的元素linkedList.set(0, "NewElement");System.out.println(linkedList);}
}

运行结果

常见用法

1

linkedList.add("Element");

在链表末尾添加元素
2linkedList.add(index, "Element");在指定位置插入元素
3linkedList.get(index);获取链表中的元素
4linkedList.set(index, "NewElement");更新链表中的元素
5linkedList.remove(index);删除指定位置的元素
6int size = linkedList.size();获取链表的大小
7linkedList.isEmpty();判断链表是否为空
8linkedList.contains("Element");查找元素是否存在
9linkedList.getFirst();linkedList.getLast();获取第一个和最后一个元素
10linkedList.removeFirst(); linkedList.removeLast();删除第一个和最后一个元素
11

Iterator<String> iterator = linkedList.iterator();

while (iterator.hasNext()) {

String element = iterator.next(); // 处理元素

}

迭代器遍历链表
12

ListIterator<String> iterator = linkedList.listIterator(linkedList.size()); while (iterator.hasPrevious()) {

String element = iterator.previous(); // 处理元素

}

反向遍历链表

 ArrayList 和 LinkedList 的性能对比

  • ArrayList:适合频繁的随机访问操作,时间复杂度为O(1)。但在中间插入或删除元素时,时间复杂度为O(n),因为需要移动后续元素。
  • LinkedList:适合频繁的插入和删除操作,时间复杂度为O(1)。但随机访问元素时,时间复杂度为O(n),因为需要从头或尾遍历链表。
  • 对时间和空间不了解的可以看时间复杂度与空间复杂度详解(曼波版)-CSDN博客

线程安全

  • ArrayList和LinkedList都不是线程安全的。如果需要在多线程环境中使用,可以使用Collections.synchronizedList来包装它们:
         List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

  • 或者使用CopyOnWriteArrayList,它是线程安全的List实现,适合读多写少的场景。

迭代器

  • ArrayList和LinkedList都支持Iterator和ListIterator。ListIterator提供了双向遍历的能力,可以在遍历过程中修改列表。
         ListIterator<String> iterator = list.listIterator();while (iterator.hasNext()) {String element = iterator.next();// 处理元素}

容量管理

  • ArrayList在内部使用数组存储元素,当数组容量不足时会自动扩容。可以通过ensureCapacity(int minCapacity)方法来预先分配足够的容量,避免频繁扩容带来的性能开销。
         ArrayList<String> list = new ArrayList<>();list.ensureCapacity(100); // 预先分配100个元素的容量

LinkedList 的特殊方法

  • LinkedList实现了Deque接口,因此可以用作栈或队列。它提供了addFirst、addLast、removeFirst、removeLast等方法,可以方便地实现栈和队列的操作。
         LinkedList<String> queue = new LinkedList<>();queue.addLast("A"); // 入队String first = queue.removeFirst(); // 出队

 性能优化建议

  • 如果需要频繁在列表中间插入或删除元素,优先选择LinkedList。
  • 如果需要频繁随机访问元素,优先选择ArrayList。
  • 如果列表大小固定且已知,可以使用Arrays.asList来创建不可变的列表,减少内存开销。
         List<String> fixedList = Arrays.asList("A", "B", "C");

进一步优化与迭代方向

  • 性能测试:在实际项目中,建议对ArrayList和LinkedList进行性能测试,根据具体场景选择最合适的集合类。
  • 并发控制:如果需要在多线程环境中使用List,可以考虑使用CopyOnWriteArrayList或Collections.synchronizedList来保证线程安全。
  • 内存优化:对于大数据量的列表,可以考虑使用ArrayList并预先分配足够的容量,避免频繁扩容带来的性能开销。

脑图

觉得不清晰文章顶部有资源可以下载

相关文章:

Java集合List详解(带脑图)

允许重复元素&#xff0c;有序。常见的实现类有 ArrayList、LinkedList、Vector。 ArrayList ArrayList 是在 Java 编程中常用的集合类之一&#xff0c;它提供了便捷的数组操作&#xff0c;并在动态性、灵活性和性能方面取得了平衡。如果需要频繁在中间插入和删除元素&#xf…...

[实验日志] VS Code 连接服务器上的 Python 解释器进行远程调试

目录 0. 前言 1. 环境 2. 准备工作 2.1 安装VS Code 2.2 安装插件 2.3 配置远程服务器 2.4 修改设置 2.5 打开远程调试窗口 3. 调试代码 3.1 输密码 3.2 打开服务器文件夹 3.3 配置Python环境 3.4 调试Python代码 补充&#xff1a;使用调试控制台&#xff0c;查看…...

(14)gdb 笔记(7):以日志记录的方式来调试多进程多线程程序,linux 命令 tail -f 实时跟踪日志

&#xff08;44&#xff09;以日志记录的方式来调试多进程多线程程序 &#xff1a; 这是老师的日志文件&#xff0c;可以用来模仿的模板&#xff1a; &#xff08;45&#xff09;实时追踪日志的 tail -f 命令&#xff1a; &#xff08;46&#xff09; 多种调试方法结合起来用 …...

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…...

四柱预测学

图表 后天八卦 十二地支不仅代表了时间,还代表了方位。具体来说: ‌子‌:代表正北方‌丑寅‌:合起来代表东北方‌卯‌:代表正东方‌辰巳‌:合起来代表东南方‌午‌:代表正南方‌未申‌:合起来代表西南方‌酉‌:代表正西方‌戌亥‌:合起来代表西北方‌四季-五行-六神…...

【个人开发】macbook m1 Lora微调qwen大模型

本项目参考网上各类教程整理而成&#xff0c;为个人学习记录。 项目github源码地址&#xff1a;Lora微调大模型 项目中微调模型为&#xff1a;qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…...

sqli-labs靶场实录(二): Advanced Injections

sqli-labs靶场实录: Advanced Injections Less21Less22Less23探测注入点 Less24Less25联合注入使用符号替代 Less25aLess26逻辑符号绕过and/or过滤双写and/or绕过 Less26aLess27Less27aLess28Less28aLess29Less30Less31Less32&#xff08;宽字节注入&#xff09;Less33Less34Le…...

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…...

机器学习-线性回归(最大似然估计)

机器学习任务可以分为两类: 一类是样本的特征向量 &#x1d499; 和标签 &#x1d466; 之间存在未知的函数关系&#x1d466; h(&#x1d499;)&#xff0c;另一类是条件概率&#x1d45d;(&#x1d466;|&#x1d499;)服从某个未知分布。最小二乘法是属于第一类&#xff0c…...

【信息系统项目管理师-案例真题】2017上半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】8 分【问题2】4 分【问题3】8 分【问题4】5 分试题二【问题1】10 分【问题2】8 分【问题3】6 分【问题4】5 分试题三【问题1】5 分【问题2】7 分【问题3】6 分【问题4】3 分试题一 阅读下列说明…...

CSP晋级组比赛生成文件夹与文件通用代码Python

快速生成文件夹与文件的脚本 import sys import osmyfiles sys.argv[1::] for f in myfiles:os.mkdir(f)os.system(f"touch {f}/{f}.in")os.system(f"touch {f}/{f}.out")os.system(f"touch {f}/{f}.cpp")with open("template.cpp",…...

正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A

在正则表达式中&#xff0c;零宽断言是一种非常强大的工具&#xff0c;能够在不消费字符的情况下对匹配位置进行约束。除了环视&#xff08;lookahead 和 lookbehind&#xff09;以外&#xff0c;还有一些常用的零宽断言&#xff0c;它们用于处理边界、字符串的开头和结尾等特殊…...

Android 中实现 PDF 预览三种方式

目录 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09; 步骤&#xff1a;2. 使用第三方库 MuPDF步骤&#xff1a;3. 使用第三方库 PdfiumAndroid步骤&#xff1a; 1. 使用第三方库 PdfRenderer&#xff08;适用于 Android 5.0 及以上&#xff09…...

尚硅谷课程【笔记】——大数据之Zookeeper【二】

课程视频&#xff1a;【尚硅谷Zookeeper教程】 四、Zookeeper实战 4.1分布式安装部署 1. 集群规划 在Hadoop102、Hadoop103和Hadoop104三个节点上部署Zookeeper 2. 解压安装 1&#xff09;解压Zookeeper.tar.gz到指定目录 tar -zxvf zookeeper-3.7.2.tar.gz -C /opt/mod…...

CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发

CodeGPT IDEA DeepSeek&#xff0c;在IDEA中引入DeepSeek 版本说明 建议和我使用相同版本&#xff0c;实测2022版IDEA无法获取到CodeGPT最新版插件。&#xff08;在IDEA自带插件市场中搜不到&#xff0c;可以去官网搜索最新版本&#xff09; ToolsVersionIntelliJ IDEA202…...

postgresql 游标(cursor)的使用

概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标&#xff0c;因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量&#xff0c;这是函数返回大数据集的有效方式&#xff0c;函数调用者…...

计算机组成原理——指令系统(六)

在时间的长河中&#xff0c;我们都是追梦人&#xff0c;脚下的每一步都在刻画未来的模样。无论世界如何变幻&#xff0c;心中的那团火焰都不应熄灭。它是你突破黑暗、迎接黎明的力量源泉。每一个不曾起舞的日子&#xff0c;都是对生命的辜负&#xff1b;每一次跌倒后的站起&…...

Python设计模式 - 原型模式

定义 原型模式是一种创建型设计模式&#xff0c;它可以通过复制现有对象来创建新对象&#xff0c;而不是直接实例化新的对象。 结构 抽象原型&#xff08;Prototype&#xff09;&#xff1a;声明 clone() 方法&#xff0c;以便派生类实现克隆自身的能力。具体原型&#xff08…...

金和OA C6 DownLoadBgImage任意文件读取漏洞

金和OA C6 DownLoadBgImage任意文件读取漏洞 漏洞描述 金和C6数据库是一款针对企业信息化管理而设计的高级数据库管理系统&#xff0c;主要应用于企业资源规划&#xff08;ERP&#xff09;、客户关系管理&#xff08;CRM&#xff09;以及办公自动化&#xff08;OA&#xff09…...

【stm32学习】STM32F103实操primary(FlyMCU)

github插入图片实在是太难用了&#xff0c;暂时懒得学就先用CSDN吧hh 一、在设备管理器下&#xff0c;找到单片机&#xff0c;并检查与FlyMCU-搜索端口 显示的是否一致 二、在搜索串口右面的栏里选中该Port&#xff0c;波特率选中115200 三、选择文件夹中的.hex文件&#xff0…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...