Java List 集合详解:基础用法、常见实现类与高频面试题解析
正文
在 Java 集合框架中,List
是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List
接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。
👉点击获取2024Java学习资料
1. 什么是 List?
List
是 Java 集合框架中的一个接口,它继承了 Collection
接口,用于存储一组有序的元素。与普通数组相比,List
提供了动态调整大小和丰富操作方法的功能。
特点:
- 元素有序,可通过索引访问。
- 允许存储重复的元素。
- 可以存储
null
值。
常用实现类:
ArrayList
LinkedList
Vector
CopyOnWriteArrayList
(线程安全)
2. List 的基本操作
以下是 List
接口的一些常用方法:
方法 | 描述 |
---|---|
add(E e) | 在列表末尾添加元素 |
add(int index, E e) | 在指定位置插入元素 |
get(int index) | 根据索引获取元素 |
set(int index, E e) | 修改指定索引的元素 |
remove(int index) | 移除指定索引的元素 |
size() | 返回列表中元素的数量 |
contains(Object o) | 判断列表是否包含指定元素 |
indexOf(Object o) | 返回元素的首次出现索引 |
isEmpty() | 判断列表是否为空 |
代码示例:
import java.util.*;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();// 添加元素list.add("Java");list.add("Python");list.add("C++");// 插入元素list.add(1, "JavaScript");// 获取元素System.out.println("元素:" + list.get(1));// 修改元素list.set(2, "C#");// 删除元素list.remove(3);// 遍历列表for (String item : list) {System.out.println(item);}}
}
3. 常用的 List 实现类
3.1 ArrayList
ArrayList
是基于动态数组实现的列表,适合频繁查询的场景。
特点:
- 随机访问效率高。
- 插入或删除时可能需要移动大量元素。
- 非线程安全。
代码示例:
import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);numbers.add(3);System.out.println("ArrayList: " + numbers);}
}
3.2 LinkedList
LinkedList
是基于双向链表实现的列表,适合频繁插入和删除的场景。
特点:
- 查询效率较低,需要从头开始遍历。
- 插入和删除效率高。
- 可以用作队列(
Queue
)或双端队列(Deque
)。
代码示例:
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> queue = new LinkedList<>();queue.add("Alice");queue.add("Bob");queue.add("Charlie");System.out.println("LinkedList: " + queue);// 模拟队列操作System.out.println("Poll: " + queue.poll()); // 移除并返回队首元素}
}
3.3 Vector
Vector
是线程安全的动态数组,适合多线程场景。
特点:
- 每个方法都使用了同步机制。
- 性能比
ArrayList
较低,但线程安全。
代码示例:
import java.util.Vector;public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Apple");vector.add("Banana");vector.add("Cherry");System.out.println("Vector: " + vector);}
}
3.4 CopyOnWriteArrayList
CopyOnWriteArrayList
是线程安全的 ArrayList
实现,适合多线程且读多写少的场景。
特点:
- 每次修改时都会复制底层数组。
- 读操作不需要锁,性能高。
- 写操作的性能较低。
代码示例:
import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListExample {public static void main(String[] args) {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();list.add("Thread-safe");list.add("Example");System.out.println("CopyOnWriteArrayList: " + list);}
}
4. List 的扩展用法
4.1 排序操作
Collections.sort
方法可以对列表进行排序:
代码示例:
import java.util.*;public class SortExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 3, 8, 1);Collections.sort(numbers);System.out.println("排序后: " + numbers);}
}
4.2 遍历方式
-
for-each 循环:
for (String item : list) {System.out.println(item); }
-
Iterator:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) {System.out.println(iterator.next()); }
-
Stream API:
list.stream().forEach(System.out::println);
4.3 Stream 和 Lambda 表达式
利用 Stream
可以方便地对列表进行操作:
代码示例:
import java.util.*;public class StreamExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie");names.stream().filter(name -> name.startsWith("A")).forEach(System.out::println);}
}
5. 面试中关于 List 的高频问题
-
ArrayList 和 LinkedList 的区别:
- ArrayList 基于数组,查询快,插入和删除慢。
- LinkedList 基于链表,插入和删除快,查询慢。
-
Vector 和 ArrayList 的区别:
- Vector 是线程安全的,ArrayList 是非线程安全的。
- Vector 性能相对较低。
-
线程安全的 List 实现有哪些?
Vector
CopyOnWriteArrayList
-
如何避免 ConcurrentModificationException?
- 使用
Iterator
的remove
方法。 - 使用线程安全的集合如
CopyOnWriteArrayList
。
- 使用
6. 总结
List
是 Java 集合框架中非常重要的一部分,其各种实现类在不同的场景下各有优势。掌握 List
的基本用法和实现类的特性,不仅有助于日常开发,还能应对 Java 面试中的高频考察。
希望本文对你理解 List
及其常用扩展有所帮助!
相关文章:
Java List 集合详解:基础用法、常见实现类与高频面试题解析
正文 在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。 👉点击获取2024Java学习资料 1…...

Arduino UNO 驱动1.8 TFT屏幕显示中文
背景 最近入手了一块1.8寸的tft屏幕,通过学习文档,已经掌握了接线,显示英文、数字、矩形区域、划线、画点等操作, 但是想显示中文的时候操作比较复杂。 问题 1、arduino uno 驱动这款屏幕目前使的是自带的<TFT.h> 库操作…...

Flink operator实现自动扩缩容
官网文档位置: 1.Autoscaler | Apache Flink Kubernetes Operator 2.Configuration | Apache Flink Kubernetes Operator 1.部署K8S集群 可参照我之前的文章k8s集群搭建 2.Helm安装Flink-Operator helm repo add flink-operator-repo https://downloads.apach…...

分布式系统架构6:链路追踪
这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下…...

vite-plugin-imagemin安装问题
vite-plugin-imagemin 是一款图片资源压缩插件,能够在打包的时候显著的降低图片资源占用。不过,在安装过程中我们遇到了如下的问题。 对于上面的问题,有以下几种常见的解决方案: 1,使用 yarn 在 package.json 内配置(推荐) 打开 package.json 配置文件,然后添加如下脚本…...

Git revert回滚
回退中间的某次提交(此操作在预生产分支上比较常见),建议此方式使用命令进行操作(做好注释,方便后续上线可以找到这个操作) Git操作: 命令:revert -n 版本号 1:git re…...

永磁同步电机预测模型控制(MPC)
永磁同步电机预测模型控制(MPC) 文章目录 前言1、模型预测控制1.1 连续控制集模型预测控制(CCS-MPC)1.2 有限控制集模型预测控制(FCS-MPC)1.3 模型预测控制的优缺点 2、永磁同步电机模型预测控制2.1 预测模型2.2 价值…...
【JAVA】switch ... case ... 的用法
语法结构: switch(表达式){ case 值1: 表达式和值1匹配时执行的语句 break; case 值2: 表达式和值2匹配时执行的语句 break; …...

基于STM32的热带鱼缸控制系统的设计
文章目录 一、热带鱼缸控制系统1.题目要求2.思路3.电路仿真3.1 未仿真3.2 开始仿真,显示屏显示水温、浑浊度、光照强度等值3.3 当水温低于阈值,开启加热并声光报警3.4 当浑浊度高于阈值,开启自动换水并声光报警3.5 当光照低于阈值,…...

Vue项目整合与优化
前几篇文章,我们讲述了 Vue 项目构建的整体流程,从无到有的实现了单页和多页应用的功能配置,但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案,就像大楼造完需要进行最后的项目验收改进一样,有待我们进一步…...

WinForm开发-自定义组件-1. 工具栏: UcompToolStrip
这里写自定义目录标题 1. 工具栏: UcompToolStrip1.1 展示效果1.2 代码UcompToolStrip.csUcompToolStrip.Designer.cs 1. 工具栏: UcompToolStrip 自定义一些Winform组件 1.1 展示效果 1)使用效果 2)控件事件 1.2 代码 设计 编码 UcompToolStrip.…...

法律专业legal case的留学论文写作技巧分析(1)
对于法律专业的留学生而言,案例的分析是写作的重要方面。无论留学的国家是英、美、澳洲还是加拿大,它们都属于case law 的法律体系。一个非常显著的特点便是通过对案例进行分析和提炼,从中总结提炼出principle和rules。case analysis的留学论…...
2025编程技术前沿:探索最新的开发工具与趋势
随着技术的飞速发展,编程领域每天都在演化,新的技术、框架和工具层出不穷。本文将聚焦2025年最具潜力和吸引力的编程技术与工具,从前沿语言到最受欢迎的开发框架,带您一起探索软件开发领域的最新趋势。 一、编程语言的新生代之星…...

sqlserver sql转HTMM邮件发送
通过sql的形式,把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…...

GeoTrust True BusinessID Wildcard
GeoTrust由DigiCert 提供支持,是最受信任和尊重的品牌之一,以提供高保证的网站安全而闻名。 GeoTrust True BusinessID通配符证书 – 以低成本保护多个主机名。即使将其用于您的公司主页或电子邮件服务器主机名,保护所有敏感信息也是您的目标…...
R语言的数据结构
R语言的数据结构 R语言是专门为统计计算和数据分析而设计的一种编程语言,因其强大的数据处理能力而受到广泛欢迎。在R中,数据结构是理解和有效使用R语言的基础。本文将详细介绍R语言中的主要数据结构,包括向量、矩阵、数据框、列表、因子等&…...
安装和配置MySQL教程
以下是在不同操作系统下安装和配置MySQL的详细教程: Windows系统 下载MySQL安装包 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/),根据你的操作系统版本(32位或64位)下载相应的MySQL Commu…...

黑马Java面试教程_P10_设计模式
系列博客目录 文章目录 系列博客目录前言1. 工厂方法模式1.1 概述1.2 简单工厂模式1.2.1 结构1.2.2 实现1.2.3 优缺点 1.3 工厂方法模式1.3.1 概念1.3.2 结构1.3.3 实现1.3.4 优缺点 1.4 抽象工厂模式1.4.1 概念1.4.2 结构1.4.3 实现1.4.4 优缺点1.4.5 使用场景 总结࿰…...
043_小驰私房菜_MTK Camera,Hal层将camera型号写到property属性中
【问题背景】 app层需要知道当前设备的摄像头型号,然后做一些差异化处理。底下如何上报这个摄像头型号? 【分析】 在kernel和hal层,都是有地方能获取到当前摄像头的型号,就看在哪里添加方便。获取到摄像头硬件型号后,将其写入到property属性, 然后app就可以通过读取该…...

基础图形化界面的一个图片爬虫期末
下面是爬取界面: 点击即可自动化爬取 以下是完整代码: import tkinter as tk import requests import os #用于文件和目录操作。# 图片爬虫函数 def image_spider(textbox):headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...