Java List 接口知识点详解

一、List 接口概述

1. 基本定义

  • 继承关系List 是 Java 集合框架(Collection Framework)中的一个有序队列接口,直接继承自 Collection 接口。
  • 核心特性
    • 有序性:元素按插入顺序存储,可通过索引(Index)访问元素。
    • 可重复性:允许存储重复元素。
    • 动态扩容:底层实现类(如 ArrayListLinkedList)支持动态调整容量。

2. 与其他接口的区别

接口有序性重复性数据结构典型实现类
List线性表ArrayListLinkedList
Set集合(哈希表等)HashSetTreeSet
Queue队列(FIFO)LinkedListPriorityQueue

二、List 接口核心方法

1. 元素操作方法

(1)添加元素
  • boolean add(E e):向列表末尾添加元素,成功返回 true
List<String> list = new ArrayList<>();
list.add("Apple"); // 添加到末尾

void add(int index, E element):在指定索引处插入元素,后续元素后移。

list.add(1, "Banana"); // 在索引1处插入元素
(2)删除元素
  • E remove(int index):移除指定索引处的元素,返回被删除元素。
String removed = list.remove(0); // 移除索引0的元素

boolean remove(Object o):移除列表中第一个匹配的元素(通过 equals 方法判断)。

list.remove("Apple"); // 移除值为"Apple"的元素
(3)修改元素
  • E set(int index, E element):用指定元素替换指定索引处的元素,返回旧元素。
String oldValue = list.set(0, "Grape"); // 将索引0的元素改为"Grape"
(4)查询元素
  • E get(int index):返回指定索引处的元素。
String first = list.get(0); // 获取索引0的元素

int indexOf(Object o):返回元素首次出现的索引,不存在则返回 -1

int pos = list.indexOf("Banana"); // 查询"Banana"的位置
  • int lastIndexOf(Object o):返回元素最后一次出现的索引,不存在则返回 -1

2. 集合操作方法

  • boolean contains(Object o):判断列表是否包含指定元素(基于 equals)。
  • boolean.addAll(Collection<? extends E> c):将其他集合的所有元素添加到列表末尾。
  • void clear():移除列表中的所有元素。
  • boolean isEmpty():判断列表是否为空。
  • int size():返回列表中的元素个数。

3. 迭代与视图方法

  • 迭代器(Iterator)
Iterator<String> it = list.iterator();
while (it.hasNext()) {String element = it.next();// 处理元素
}

列表迭代器(ListIterator):支持双向遍历和元素修改:

ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {String element = lit.next();lit.set(element + "_modified"); // 修改元素
}
  • 子列表(SubList):返回列表中指定范围的视图(List.subList(int fromIndex, int toIndex)):
List<String> sub = list.subList(0, 2); // 包含索引0,不包含索引2

三、List 接口的实现类

1. ArrayList

(1)特点
  • 底层结构:动态数组(Object[])。
  • 优缺点
    • ✅ 随机访问(get(int))速度快(时间复杂度 O (1))。
    • ❌ 插入 / 删除元素时需移动后续元素,效率较低(时间复杂度 O (n))。
  • 适用场景:频繁查询、较少增删的场景(如数据展示、日志记录)。
(2)扩容机制
  • 初始容量默认值为 10(JDK 1.8)。
  • 当元素数量超过容量时,新容量为 原容量的 1.5 倍(通过 Arrays.copyOf 复制数组)。

2. LinkedList

(1)特点
  • 底层结构:双向链表(每个节点包含 prevnext 指针)。
  • 优缺点
    • ✅ 插入 / 删除元素时只需修改指针,效率高(时间复杂度 O (1),若已知节点位置)。
    • ❌ 随机访问需遍历链表,效率低(时间复杂度 O (n))。
  • 适用场景:频繁增删的场景(如队列、栈、缓存)。
(2)特殊方法
  • 可作为队列(Queue)使用:
LinkedList<String> queue = new LinkedList<>();
queue.offer("A"); // 入队(添加到末尾)
String first = queue.poll(); // 出队(移除并返回头部元素)

可作为栈(Stack)使用:

queue.push("B"); // 入栈(添加到头部)
String last = queue.pop(); // 出栈(移除并返回头部元素)

3. Vector(线程安全)

(1)特点
  • 底层结构:动态数组,与 ArrayList 类似。
  • 线程安全:方法通过 synchronized 修饰(如 add()get()),但性能较低。
  • 适用场景:多线程环境下需要线程安全的场景(较冷门,推荐使用 Collections.synchronizedList() 替代)。

4. 实现类对比表

实现类底层结构线程安全随机访问效率增删效率(中间位置)默认初始容量
ArrayList动态数组高(O (1))低(O (n))10
LinkedList双向链表低(O (n))高(O (1))-
Vector动态数组高(O (1))低(O (n))10

四、List 接口的常用操作场景

1. 遍历列表的 4 种方式

(1)普通 for 循环(索引遍历)
for (int i = 0; i < list.size(); i++) {String element = list.get(i);
}

适用场景:需要通过索引操作元素(如修改、删除)。

(2)增强 for 循环(foreach)
for (String element : list) {// 只读操作元素
}

注意:遍历时若修改列表(如 list.remove()),会抛出 ConcurrentModificationException(fail-fast 机制)。

(3)Iterator 迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {String element = it.next();if (element.equals("Apple")) {it.remove(); // 安全删除元素的方式}
}

优势:支持遍历过程中安全删除元素(通过 Iterator.remove())。

(4)Java 8 Stream 流式遍历
list.stream().forEach(element -> {System.out.println(element);
});

适用场景:结合 Lambda 表达式实现复杂逻辑(如过滤、映射)。

2. 列表排序与搜索

(1)排序(Collections.sort()
List<Integer> nums = Arrays.asList(3, 1, 4, 2);
Collections.sort(nums); // 升序排列(默认自然排序)
// 自定义排序(降序)
Collections.sort(nums, (a, b) -> b - a);
(2)二分查找(Collections.binarySearch()
Collections.sort(nums); // 需先排序
int index = Collections.binarySearch(nums, 3); // 返回元素3的索引

3. 线程安全处理

  • 场景:多线程环境下操作 List 时,需保证线程安全。
  • 解决方案
    1. 使用 Vector(性能较低)。
    2. 通过 Collections.synchronizedList() 包装普通 List
List<String> safeList = Collections.synchronizedList(new ArrayList<>());

使用并发包 java.util.concurrent 中的 CopyOnWriteArrayList(适用于读多写少场景):

List<String> concurrentList = new CopyOnWriteArrayList<>();

五、常见问题与最佳实践

1. ArrayList vs LinkedList 如何选择?

  • 优先选 ArrayList:需要频繁随机访问(如查询),或数据量已知、增删操作少。
  • 优先选 LinkedList:需要频繁在头部 / 中间插入 / 删除元素,或数据量不确定、需高效动态调整。

2. 列表扩容的性能影响

  • ArrayList 扩容时会创建新数组并复制旧元素,若初始容量预估不足,多次扩容会导致性能下降。
  • 最佳实践:通过构造方法指定初始容量:
    List<String> list = new ArrayList<>(100); // 初始容量设为100,减少扩容次数

    3. 避免内存泄漏

  • 若存储大量对象,需及时调用 clear() 或置为 null,帮助垃圾回收器回收内存。
  • 强制类型转换风险:非泛型 List 会存储 Object 类型,取出时需强制类型转换,可能引发 ClassCastException
  • 最佳实践:使用泛型限定元素类型:
List<String> list = new ArrayList<>(); // 限定只能存储String类型

六、总结

特性List 接口特点
核心优势有序性、可重复性、索引访问,适用于需要按顺序操作的数据场景。
实现类选择- 高频查询:ArrayList
- 高频增删:LinkedList
- 线程安全:CopyOnWriteArrayList
常用操作添加 / 删除元素、遍历、排序、子列表操作、线程安全处理。

通过掌握 List 接口的核心方法与实现类特性,可在开发中高效处理线性数据集合,提升代码的健壮性与性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV-去噪效果和评估指标方法

实验前言 噪音类型 opencv常见噪音类型有 高斯噪音&#xff1a;高斯噪音是一种随机噪音&#xff0c;其数值服从正态分布。图像受到高斯噪音的影响时&#xff0c;像素值的变化类似于白噪音&#xff0c;但是噪音的强度会随像素值的变化而变化。 椒盐噪音&#xff1a;椒盐噪音是…

永磁同步电机公式总结【一】——反电动势、磁链、转矩公式;三项、两项电压方程;坐标表换方程

一、PMSM 电机参数介绍 1.1 转子极数 转子极数 (Rotor Poles) &#xff1a;三相交流电机每组线圈都会产生 N、S 磁极&#xff0c;每个电机每相含有的永磁体磁极个数就是极数。由于磁极是成对出现的&#xff0c;所以电机有 2、4、6、8……极 (偶数)。 未知参数的电机&#xff…

eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点

一、eMMC 技术深度解析 1.定义与背景 eMMC&#xff08;Embedded Multi Media Card&#xff09;是一种专为嵌入式系统设计的非易失性存储解决方案&#xff0c;它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA&#xff08;Ball Grid Array&#xff09;封装中。其核心目标是简…

常见提示词攻击方法和防御手段——提示词越狱

提示词越狱&#xff08;Prompt Jailbreaking&#xff09;是一种针对大型语言模型&#xff08;LLM&#xff09;的攻击手段&#xff0c;旨在通过精心设计的输入提示绕过模型的安全审查和伦理限制&#xff0c;使其生成原本被禁止的内容&#xff08;如暴力、非法操作、敏感信息等&a…

MySQL之基础事务和隔离级别

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

学习记录:DAY29

项目开发日志&#xff1a;技术实践与成长之路 前言 回顾这几天的状态&#xff0c;热情总是比我想象中更快被消耗完。比起茫然徘徊的小丑&#xff0c;我更希望自己是对着风车冲锋的疯子。 今天继续深入项目的实际业务。 状态好点的时候&#xff0c;再看自己EMO时写的东西&…

kotlin Android AccessibilityService 无障碍入门

安卓的无障碍模式可以很好的进行自动化操作以帮助视障人士自动化完成一些任务。 无障碍可以做到&#xff0c;监听屏幕变化&#xff0c;朗读文本&#xff0c;定位以及操作控件等。 以下从配置到代码依次进行无障碍设置与教程。 一、配置 AndroidManifest.xml 无障碍是个服务…

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器&#xff08;监视器&#xff09; 1.作用&#xff1a; 2.语法&#xff1a; 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 &#x1f4ac; 欢迎讨论&#…

WPS中代码段的识别方法及JS宏实现

在WPS中&#xff0c;文档的基本结构可以通过对象模型来理解&#xff1a; &#xff08;1&#xff09;Document对象&#xff1a;表示整个文档 &#xff08;2&#xff09;Range对象&#xff1a;表示文档中的一段连续区域&#xff0c;可以是一个字符、一个句子或整个文档 &#…

el-tree结合el-tree-transfer实现穿梭框里展示树形数据

参考文章&#xff1a;我把他的弹框单拉出来一个独立文件作为组件方便使用&#xff0c;遇到一些问题记录一下。 testComponet.vue <template><div class"per_container"><div class"per_con_left"><div class"per_con_title&q…

Go 后端中双 token 的实现模板

下面是一个典型的 Go 后端双 Token 认证机制 实现模板&#xff0c;使用 Gin 框架 JWT Redis&#xff0c;结构清晰、可拓展&#xff0c;适合实战开发。 项目结构建议 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 从请求…

Typescript学习教程,从入门到精通,TypeScript 对象语法知识点及案例代码(7)

TypeScript 对象语法知识点及案例代码 TypeScript 是 JavaScript 的超集&#xff0c;提供了静态类型检查和其他增强功能。在 TypeScript 中&#xff0c;对象是面向对象编程&#xff08;OOP&#xff09;的基础。 一、对象概述 在 TypeScript 中&#xff0c;对象是属性的集合&a…

应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因

本文运用AI量化分析框架&#xff0c;结合市场情绪因子、宏观经济指标及技术面信号&#xff0c;对黄金与美元指数的联动关系进行解析&#xff0c;揭示本轮贵金属回调的深层驱动因素。 周三&#xff0c;现货黄金价格单日跌幅达2.1%&#xff0c;盘中触及3167.94美元/盎司关键价位&…

命令行登录 MySQL 报 Segmentation fault 故障解决

问题描述&#xff1a;对 mysql8.0.35 源码进行 make&#xff0c;由于一开始因为yum源问题少安装依赖库 库&#xff0c;在链接时遇到错误 undefined reference to&#xff0c;后来安装了相关依赖库&#xff0c;再次 make 成功。于是将 mysqld 启动&#xff0c;再用 mysql -u roo…

Axure设计数字乡村可视化大屏:构建乡村数据全景图

今天&#xff0c;让我们一同深入了解由Axure设计的数字乡村可视化大屏&#xff0c;看看它如何通过精心的布局和多样化的图表类型&#xff0c;将乡村的各类数据以直观、易懂的方式呈现出来&#xff0c;为乡村管理者提供有力的数据支持。 原型效果预览链接&#xff1a;Axure数字乡…

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…

智能开发工具PhpStorm v2025.1——增强AI辅助编码功能

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

Spark 的运行模式(--master) 和 部署方式(--deploy-mode)

Spark 的 运行模式&#xff08;--master&#xff09; 和 部署方式&#xff08;--deploy-mode&#xff09;&#xff0c;两者的核心区别在于 资源调度范围 和 Driver 进程的位置。 一、核心概念对比 维度--master&#xff08;运行模式&#xff09;--deploy-mode&#xff08;部署…

sqli—labs第八关——布尔盲注

一&#xff1a;确定注入类型 按照我们之前的步骤来 输入 ?id1 and 11-- ?id1 and 12-- 界面正常 第二行界面异常空白 所以注入类型为单引号闭合型 二&#xff1a; 布尔盲注 1.判断是否使用条件 &#xff08;1&#xff09;&#xff1a;存在注入但不会直接显示查询结果 …

ARP 原理总结

&#x1f310; 一、ARP 原理总结 ARP&#xff08;Address Resolution Protocol&#xff09;是用于通过 IP 地址解析 MAC 地址的协议&#xff0c;工作在 链路层 与 网络层之间&#xff08;OSI 模型的第三层与第二层之间&#xff09;。 &#x1f501; ARP通信过程&#xff1a; …