Day27 | Java集合框架之List接口详解 - 实践

news/2025/10/14 9:44:56/文章来源:https://www.cnblogs.com/yxysuanfa/p/19140020

昨天我们学习了Collection,今天我们看看它最常用的子接口之一——List。

List代表一个有序、可重复的元素集合,支持根据索引进行访问、插入、删除等操作。

常见的实现类包括ArrayList和LinkedList,它们在底层结构、性能特征和适用场景上有明显差异。

一、List接口概述

List接口是java.util包中的一个重要接口,它继承自Collection,定义了线性序列中元素的插入、删除、替换、查找等操作。

常用方法:

public interface List extends Collection {
// 在末尾添加元素
boolean add(E e);
// 指定位置插入元素
void add(int index, E element);
// 获取指定索引的元素
E get(int index);
// 删除指定位置的元素
E remove(int index);
// 删除首次出现的指定元素
boolean remove(Object o);
// 返回元素首次出现的索引
int indexOf(Object o);
// 返回元素最后出现的索引
int lastIndexOf(Object o);
// 获取子列表
List subList(int fromIndex, int toIndex);
// 获取支持双向遍历的迭代器
ListIterator listIterator();
}

示例:

package com.lazy.snail;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*** @ClassName Day27Demo* @Description TODO* @Author lazysnail* @Date 2025/6/24 10:51* @Version 1.0*/
public class Day27Demo {public static void main(String[] args) {List strList = new ArrayList<>();// 添加元素strList.add("懒惰");strList.add("蜗牛");strList.add("学");strList.add("JAVA");System.out.println("初始列表:" + strList);// 指定位置插入元素strList.add(2, "不学");System.out.println("指定插入后列表:" + strList);// 获取指定索引元素String str2 = strList.get(2);System.out.println("索引2处元素:" + str2);// 删除指定索引元素strList.remove(2);System.out.println("删除索引2元素后列表:" + strList);// 删除首次出现的元素strList.remove("懒惰");System.out.println("删除'懒惰'后列表:" + strList);// 添加重复元素strList.add("蜗牛");strList.add("蜗牛");strList.add("蜗牛");strList.add("蜗牛");System.out.println("添加重复元素后列表:" + strList);// 返回元素首次出现的索引int firstSnailIndex = strList.indexOf("蜗牛");System.out.println("第一个'蜗牛'的索引:" + firstSnailIndex);// 返回元素最后出现的索引int lastSnailIndex = strList.lastIndexOf("蜗牛");System.out.println("最后一个'蜗牛'的索引:" + lastSnailIndex);// 获取子列表(fromIndex 包含,toIndex 不包含)List sub = strList.subList(0, 3);System.out.println("子列表 [0,3):" + sub);// 使用 ListIterator 双向遍历ListIterator iterator = strList.listIterator();System.out.println("正向遍历:");while (iterator.hasNext()) {System.out.println("→ " + iterator.next());}System.out.println("反向遍历:");while (iterator.hasPrevious()) {System.out.println("← " + iterator.previous());}}
}

二、ArrayList

第一节中的示例代码就是使用的ArrayList。

ArrayList是List接口最核心、最常用的实现类。

它的名字其实已经暴露了它大概的实现方式:Array(数组)。

1、底层结构

ArrayList内部封装了一个可以动态调整大小的Object[]数组。

// 存储数据的数组
transient Object[] elementData;
// 当前元素个数
private int size;

2、添加元素

public boolean add(E e) {modCount++;add(e, elementData, size);return true;
}
private void add(E e, Object[] elementData, int s) {if (s == elementData.length)elementData = grow();elementData[s] = e;size = s + 1;
}

每次添加元素的时候都会检查是不是需要扩容,扩容一般是原容量的 1.5 倍:

3、删除元素

由于是基于数组,插入和删除操作都涉及到元素的批量移动,效率为 O(n)。

4、ArrayList有什么优缺点

由于底层是连续的内存空间,通过索引get(i)访问元素的时候,CPU可以直接通过"起始地址 + i * 元素大小"的公式计算出地址,时间复杂度是O(1),所以查询速度非常快。

它使用的是尾插法,在没有触发扩容的情况下,往列表末尾添加元素只是简单的赋值操作,速度也很快。即使偶尔发生扩容,这种开销在大量操作中被平摊后,平均复杂度依然是O(1)。

但是如果在列表的中间进行增删,会导致该位置之后的所有元素进行批量移动,数据量越大,开销越大。

三、LinkedList

LinkedList底层基于双向链表。它由许多独立的节点串联而成,每个Node都存放着数据以及指向前后节点的引用。

1、底层结构

LinkedList是基于双向链表实现的,每个节点包含三个指针:

2、插入删除

因为链表结构,插入和删除某个节点只需调整前后节点的引用,不涉及数据移动,效率为O(1)。

但前提是已经定位到了目标节点,而定位的过程是O(n)。

3、查询

访问第n个元素的时候,需要从头或尾开始遍历,效率为O(n)。这个查询过程就是上面我们说的定位。

4、注意点

在实际开发中,我们基本上都是通过索引或遍历查找来定位元素,这个定位过程在LinkedList中是O(n) 的,它彻底拖垮了后续O(1)的修改优势。

add(index, e): O(n) 查找 + O(1) 修改 = 整体 O(n)

remove(Object o): O(n) 查找 + O(1) 修改 = 整体 O(n)

LinkedList在"按索引/对象增删"这个场景下,并没有比ArrayList快,有时候还因为它的内存不连续性(对CPU缓存不友好),实际运行得更慢。

所以,实际开发中,我们很少会用到LinkedList。

就连Josh Bloch也在《Effective Java》里说了,尽量避免使用LinkedList,除非你真的需要。

结语

今天,我们大致看了List接口两大实现的内部。

也聊了下ArrayList和LinkedList在实际开发中的应用场景。

我们在学习的过程中,不仅要会用,还要通过思考,具有基于场景和性能权衡的选型能力。

下一篇预告

Day28 | Java集合框架之Set接口详解

如果你觉得这系列文章对你有帮助,欢迎关注专栏,我们一起坚持下去!

本文首发于知乎专栏

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

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

相关文章

2025 年北京开锁机构推荐:北京锁王开锁有限公司,您身边的锁具安全专家

在现代社会,随着人们生活节奏的加快以及居住、办公环境的日益复杂,锁具问题时有发生。无论是因忘带钥匙被锁门外,还是需要升级家中的锁具安防系统,都对专业开锁服务提出了更高需求。北京作为一座人口密集、商业繁荣…

jeecg vue2前端组件

https://doc.jeecg.com/2043986 # JDate 日期组件 使用文档###### 说明: antd-vue日期组件需要用moment中转一下,用起来不是很方便,特二次封装,使用时只需要传字符串即可 ## 参数配置 | 参数 | 类型 …

2025年空天信息感知与智能处理国际学术会议(AIPIP 2025)

2025年空天信息感知与智能处理国际学术会议(AIPIP 2025) 2025 International Conference on Aerospace Information Perception and Intelligent Processing 2025年空天信息感知与智能处理国际学术会议将于2025年10月…

svn常用命令命令

1.查看主干可合并的版本 svn mergeinfo --show-revs eligible ^/lb_manager_server/trunk/lb_manager_web 2.合并主干的某个特定修订版本范围(svn merge -r 命令的版本范围指定是左开右闭的,即 -r start:end 表示从 …

2025 年防撞护栏生产厂家最新推荐榜单:深度剖析各企业产品质量与服务能力,Q235/Q355B/景观/灯光/河道桥梁防撞护栏厂家推荐

在交通基础设施建设不断提速的当下,防撞护栏作为保障道路与桥梁安全的关键设施,市场需求持续增长,但市场上生产厂家良莠不齐,给采购方带来极大困扰。部分厂家原材料不达标、工艺落后,导致产品安全性能不足;有些厂…

人类一败涂地Mac版下载教程|Human Fall Flat Mac安装与游戏玩法详解

详情介绍 人类一败涂地mac版是由No Brakes Games制作Curve Digital发行的Mac平台上一款冒险物理解谜游戏。人类一败涂地Mac版游戏中玩法不是让玩家安放各种机关让小人触发,而是操作身处梦境中的主角bob,利用物理效果…

第二届航空航天、机械与材料工程国际学术会议 (AMME 2025)

第二届航空航天、机械与材料工程国际学术会议 (AMME 2025) 2025 2nd International Conference on Aerospace, Mechanical and Materials Engineering 2025年第二届航空航天、机械与材料工程国际学术会议(AMME 2025)…

从Salesforce到国产CRM,纷享销客助力顺祥新材料提速提效

当 Salesforce 这样的全球顶级系统,在实际业务中频频出现数据延迟、跨系统对接失败、关键流程卡顿,一家新材料领军企业终于转身拥抱国产 CRM 。这不是冲动决定,而是被效率拖垮后的理性反击。他们为何放弃行业标杆?…

再见 Navicat!DataGrip 正式宣布免费!!

大家好,我是R哥。 最近 JetBrains 放了个大招:DataGrip 现在对「非商业用途」免费了!DataGrip 正式加入 JetBrains 旗下对「非商业用途免费」的产品行列! 其实这不是 JetBrains 第一次这么良心了,之前像 JetBrain…

蓝牙语音遥控器方案 NRF52840、HS6621

方案介绍 蓝牙语音遥控器一般是通过按下语音键,遥控器会发送一个 HID 编码通知智能电视或者机顶盒打开识音功能,此时,遥控器LED灯保持闪烁或者长亮,用户开始录音同时将语音数据上传给智能电视或者机顶盒。而智能电…

如何本地直升Windows 11 25H2:两种方法超级简单

如何本地直升Windows 11 25H2:两种方法超级简单Posted on 2025-10-14 09:25 lzhdim 阅读(0) 评论(0) 收藏 举报进入10月份,关注操作系统的朋友可能知道,微软发布了最新的Windows 11 25H2,不过由于目前并没有全…

创意技术专家指南:如何融合编程与创造力

本文深入探讨创意技术专家的角色定位,涵盖技术架构、原型设计、文化思考等核心技能,解析如何将编程与创意完美融合,构建创新的数字体验。创意技术专家是做什么的? 从表面上看,我学习的是计算机科学。然而,我的大…

2025 年桥梁护栏厂家最新推荐排行榜:聚焦防撞、景观、不锈钢、铝合金、灯光护栏,精选优质企业助力项目高效选型

当前基础设施建设持续推进,桥梁护栏作为保障通行安全、提升桥梁美观度的关键部分,市场需求日益增长。但行业内品牌繁杂,产品质量参差不齐,部分企业用劣质材料生产导致护栏安全性能不达标,且服务体系不完善,设计、…

2025 年最新推荐!覆盖上海广州杭州等多地的居民同城长途异地跨城日式国际搬家公司优质服务排行榜

随着城市化进程加快,个人、家庭及企业的搬家需求日益多元化,从同城短迁到跨国搬迁,从普通居民搬家到专业日式服务,市场对搬家公司的要求不断提升。但当前行业仍存在服务水平参差不齐、收费乱象频发、特殊需求难以满…

完整教程:第 5 篇:WebGL 从 2D 到 3D - 坐标系、透视与相机

完整教程:第 5 篇:WebGL 从 2D 到 3D - 坐标系、透视与相机pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

CUDA+torch+flash-attn安装

微调全家桶: CUDA+torch+flash-attn安装之前安装环境一般只针对安装torch、pandas这种常用包,没有自己从头到尾来过。近期因为有微调需求,服务器需要安装flash-attn,对环境要求比较苛刻。折腾了好半天,将经验总结…

2025 年离合器厂家最新推荐排行榜:聚焦国内优质厂商,从技术到服务多维度解析,助力企业精准选购矿山/气胎/通风式/推盘离合器厂家推荐

在工业生产中,离合器作为核心传动部件,直接关系到设备运行效率与生产安全。当前国内离合器市场厂商数量繁杂,既有深耕行业多年的老牌企业,也有近年涌现的新兴品牌,产品质量、技术水平与服务能力差异显著。许多企业…

2025 年离心机厂家最新推荐排行榜:聚焦平板 / 吊袋 / 刮刀 / 拉袋等多类型设备,精选优质企业助力用户精准选型

在科研、医疗、工业生产等领域,离心机作为实现固液分离、颗粒分级的核心设备,其性能直接影响生产效率与实验结果准确性。当前离心机市场品牌繁杂、产品型号多样,不同品牌在技术实力、产品质量、售后服务等方面差异显…

共模电压测量:原理、方法与应用探析

在电子电气系统中,共模电压是影响系统稳定性、电磁兼容性(EMC)以及设备安全的关键因素之一。准确测量共模电压对于分析系统故障、优化电路设计以及保障设备可靠运行至关重要。本文将从共模电压的基本概念出发,深入…

​​差分探头技术解析:高精度电子测量的核心工具​​

差分探头适用于高共模电压环境,具备高CMRR、高精度和安全隔离,广泛应用于电力电子、电机驱动和新能源领域。​ 在电力电子和高速数字系统测试领域,差分探头已成为不可或缺的关键测量工具。随着功率半导体技术和…