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并预先分配足够的容量,避免频繁扩容带来的性能开销。

脑图

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966967.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【config目录】SpringBoot应用配置存放的地方

application.properties之前总是存放于默认的resources目录下&#xff0c;现在想想其实是不合适的&#xff0c;上线后其实这个配置是需要更改的&#xff0c;因此我们不要打包到jar包中。 根据SpringBoot应用配置查找规则&#xff0c;如果在jar包中resources目录查找不到的话&a…

洛谷 B3616 【模板】队列

B3616 【模板】队列 - 洛谷 | 计算机科学教育新生态 题目描述 请你实现一个队列&#xff08;queue&#xff09;&#xff0c;支持如下操作&#xff1a; push(x)&#xff1a;向队列中加入一个数 x。pop()&#xff1a;将队首弹出。如果此时队列为空&#xff0c;则不进行弹出操作…

布丁扫描:手机扫描的纯净之选

在众多手机扫描软件中&#xff0c;布丁扫描凭借其纯粹的使用体验脱颖而出。它是一款功能强大且完全免费的手机端扫描工具&#xff0c;没有任何广告干扰&#xff0c;用户可以畅享纯净的使用过程。更值得一提的是&#xff0c;布丁扫描从未设置过充值入口&#xff0c;也不会在扫描…

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月&#xff0c;中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛&#xff08;简称2024 CCF BDCI&#xff09;。本届比赛的算能赛道吸引了1748名选手报名&#xff0c;经过激烈角逐&#xff0c;北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…

22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口

1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位&#xff08; Absolute length units &#xff09; CSS中的相对单位&#xff08; Relative length units &#xff09; 1.em: 相对自己的font-size&#xff1b;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站&#xff0c;现在的浏览器特别只能&#xff0c;就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而&#xff0c;随着HTTPS的推出&#xff0c;传输协议通…

MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知&#xff0c;Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的&#xff0c;下面将主要…

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者&#xff1a;卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏&#xff0c;我们邀请来自微软以及技术社区专家&#xff0c;带来最前沿的技术干货与实践经验。在这里&#xff0c;您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…

艾蒿染色体水平基因组-文献精读111

A chromosome-scale genome assembly of Artemisia argyi reveals unbiased subgenome evolution and key contributions of gene duplication to volatile terpenoid diversity 一项关于艾蒿&#xff08;Artemisia argyi&#xff09;的染色体尺度基因组组装揭示了无偏的亚基因…

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途

1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多&#xff0c;删除代价也小。这种说法主要基于以下几个方面&#xff1a; &#xff08;1&#xff09;资源共享 内存空间&#xff1a;每个进程都有自己独立的内存空间&#xff0c;包括代码段…

光学和光子学模拟工具在 AR/VR 中的作用

AR/VR 中的光学和光子学 增强现实 (AR) 和虚拟现实 (VR) 站在数字进化的前沿。光学和光子学这一复杂的科学深入研究了光的产生、检测和操控&#xff0c;在这一转变中发挥着至关重要的作用。 图 1 (a) 展示了 AR 系统的设计&#xff0c;强调了光学的关键作用。该图描绘了光的旅…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

BFS算法篇——FloodFill问题的高效解决之道(下)

文章目录 前言一. 图像渲染1.1 题目链接&#xff1a;https://leetcode.cn/problems/flood-fill/description/1.2 题目分析&#xff1a;1.3 思路讲解&#xff1a;1.4 代码实现&#xff1a; 二. 岛屿数量2.1 题目链接&#xff1a;https://leetcode.cn/problems/number-of-islands…

DEEPSEEK与GPT等AI技术在机床数据采集与数字化转型中的应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;深度学习、自然语言处理等先进技术开始广泛应用于各行各业。在制造业尤其是机床行业&#xff0c;AI技术的融合带来了巨大的变革&#xff0c;尤其在机床数据采集与机床数字化方面的应用。本文将探讨DEEPSEEK、…

android手机安装deepseek-r1:1.5b

序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…

单张照片可生成写实3D头部模型!Adobe提出FaceLift,从单一的人脸图像中重建出360度的头部模型。

FaceLift是Adobe和加州大学默塞德分校推出的单图像到3D头部模型的转换技术,能从单一的人脸图像中重建出360度的头部模型。FaceLift基于两阶段的流程实现:基于扩散的多视图生成模型从单张人脸图像生成一致的侧面和背面视图;生成的视图被输入到GS-LRM重建器中,产出详细的3D高斯表…

如何使用 DataX 连接 Easysearch

DataX DataX 是阿里开源的一款离线数据同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 本篇主要介绍 DataX 如何将数据写入到 Easysearch&#xff0c;对于各种数据源的连接…

Gemini 2.0模型更新:谷歌最新AI大模型全面开启智能时代

引言 2025年2月5日&#xff0c;谷歌人工智能实验室&#xff08;Google DeepMind&#xff09;发布了最新的Gemini 2.0模型系列更新&#xff0c;包括2.0 Flash、Flash-Lite和Pro实验版本。这些AI大模型的发布标志着人工智能技术在性能、效率和多模态能力上的进一步突破&#xff…

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest)&#xff0c;可以按照以下步骤进行&#xff1a; 安装 Google Test&#xff1a;确保你已经安装了 Google Test。如果没有安装&#xff0c;可以通过 Visual Studio Installer 安装。在安装程序中&#xff0c;找到并选择 Googl…

基于SpringBoot的校园社交平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…