Java中List集合使用详细介绍
作者:MandalaO_O
Java是一门强大的编程语言,拥有丰富的数据结构和集合类,其中之一就是List列表,List是Java集合框架中的一个重要接口,它允许我们以有序、可重复的方式存储一组元素,这篇文章主要介绍了Java中List集合使用的相关资料,需要的朋友可以参考下
一、List 集合概述
List 是 Java 集合框架中 有序、可重复 的接口,继承自 Collection,允许通过索引访问元素。其核心实现类包括 ArrayList、LinkedList 和 Vector,各有不同的底层结构和适用场景。
二、核心实现类详解
1. ArrayList
底层结构:动态数组(
Object[]),支持自动扩容。核心特性:
- 访问效率:按索引访问快(时间复杂度
O(1)),适合随机访问。 - 增删效率:尾部增删快(
O(1)),中间增删慢(需移动元素,O(n))。 - 线程安全:非线程安全,多线程环境需手动同步(如
Collections.synchronizedList())。 - 内存占用:较低(仅存储数据,无额外指针开销)。
- 访问效率:按索引访问快(时间复杂度
常用方法:
ArrayList<String> list = new ArrayList<>(); list.add("元素"); // 尾部添加 list.add(1, "插入元素"); // 指定索引插入 list.set(0, "替换元素"); // 替换指定索引元素 list.get(0); // 获取索引元素 list.remove(0); // 按索引删除 list.remove("元素"); // 按值删除 list.contains("元素"); // 判断是否包含 list.size(); // 获取元素数量 list.clear(); // 清空集合遍历方式:
- 普通 for 循环(适合随机访问);
- 增强 for 循环(简洁);
forEach方法(Lambda 表达式)。
适用场景:大量读操作、随机访问频繁,元素增删较少的场景(如数据展示、查询结果存储)。
2. LinkedList
底层结构:双向链表,每个节点存储数据及前后节点引用。
核心特性:
- 访问效率:按索引访问慢(需遍历链表,
O(n)),不适合随机访问。 - 增删效率:首尾增删快(
O(1)),中间增删只需修改指针(O(n),主要耗时在遍历定位)。 - 线程安全:非线程安全。
- 内存占用:较高(需额外存储前后节点指针)。
- 访问效率:按索引访问慢(需遍历链表,
特有方法(实现
Deque接口,支持队列 / 栈操作):LinkedList<String> list = new LinkedList<>(); list.addFirst("首元素"); // 头部添加 list.addLast("尾元素"); // 尾部添加 list.getFirst(); // 获取首元素(空表抛异常) list.getLast(); // 获取尾元素(空表抛异常) list.peekFirst(); // 安全获取首元素(空表返回 null) list.peekLast(); // 安全获取尾元素(空表返回 null) list.removeFirst(); // 删除首元素(空表抛异常) list.removeLast(); // 删除尾元素(空表抛异常) list.pollFirst(); // 安全删除首元素(空表返回 null)遍历方式:
- 增强 for 循环(推荐);
- 迭代器
Iterator(支持边遍历边删除,避免并发异常); - 逆序迭代器
descendingIterator()(从尾到头遍历)。
适用场景:频繁在首尾或中间位置增删元素的场景(如队列、栈、链表结构模拟)。
3. Vector(不推荐新项目使用)
底层结构:动态数组(
Object[]),早期线程安全实现。核心特性:
- 线程安全:所有方法用
synchronized修饰,保证多线程安全,但性能较低。 - 扩容机制:默认初始容量 10,满容后扩容为原容量的 2 倍(ArrayList 为 1.5 倍)。
- 功能:与 ArrayList 类似,但方法加锁导致单线程性能差。
- 线程安全:所有方法用
常用方法:与 ArrayList 基本一致,额外支持
Enumeration遍历(遗留接口)。适用场景:需线程安全的多线程场景(现多被
ArrayList + Collections.synchronizedList()或CopyOnWriteArrayList替代)。
三、三大实现类对比表
| 特性 | ArrayList | LinkedList | Vector |
|---|---|---|---|
| 底层结构 | 动态数组 | 双向链表 | 动态数组 |
| 随机访问效率 | 快(O(1)) | 慢(O(n)) | 快(O(1)) |
| 中间增删效率 | 慢(O(n)) | 较快(O(n),定位耗时) | 慢(O(n)) |
| 首尾增删效率 | 快(O(1)) | 快(O(1)) | 快(O(1)) |
| 线程安全 | 否 | 否 | 是(方法加锁) |
| 内存占用 | 低 | 高(节点指针) | 低 |
| 适用场景 | 大量读操作、随机访问 | 频繁增删(首尾 / 中间) | 多线程安全需求(少用) |
四、使用建议
单线程场景:
- 以查询为主、少量增删 → 优先
ArrayList(性能最优)。 - 频繁增删(尤其是中间位置) → 选择
LinkedList。
- 以查询为主、少量增删 → 优先
多线程场景:
- 需线程安全 → 用
Collections.synchronizedList(new ArrayList<>())或CopyOnWriteArrayList(并发包,读多写少时高效),避免使用Vector(性能差)。
- 需线程安全 → 用
遍历注意:
ArrayList适合普通 for 循环(索引访问快);LinkedList适合增强 for 或迭代器(避免索引遍历的性能损耗);- 遍历时删除元素需用
Iterator.remove(),避免ConcurrentModificationException。
到此这篇关于Java中List集合使用详细介绍的文章就介绍到这了,更多相关Java List集合内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
