文章目录
- 235. Java 集合 - 深入理解 Collection 扩展 —— List 接口
- List 接口的两个关键特性
- 简单示例
- List 接口的主要实现类
- ❓ 该选 `ArrayList` 还是 `LinkedList`?
- 为什么 ArrayList 通常更快?
- 什么时候用 LinkedList 更合适?
- ️ 示例对比:ArrayList vs LinkedList
- 1. ArrayList 示例
- 2. LinkedList 示例
- ️ 总结:选型建议
235. Java 集合 - 深入理解 Collection 扩展 —— List 接口
在 Collection 框架中,List 是一个非常重要的子接口,它在基本集合(Collection)之上,带来了两大核心增强功能:
List 接口的两个关键特性
- 元素顺序有保障
- 在
List中,元素的顺序永远是确定的! - 遍历时,元素的顺序和它们被添加的顺序一致。
- 在
- 元素有索引(Index)
List中的每个元素都有一个整型索引(从0开始),可以通过索引高效地访问和操作元素。
简单示例
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<String> fruits = List.of("Apple", "Banana", "Cherry");System.out.println("First element: " + fruits.get(0)); // AppleSystem.out.println("Second element: " + fruits.get(1)); // Bananafor (int i = 0; i < fruits.size(); i++) {System.out.println("fruits[" + i + "] = " + fruits.get(i));}}}
️ 输出:
First element: Apple
Second element: Banana
fruits[0] = Apple
fruits[1] = Banana
fruits[2] = Cherry
List 接口的主要实现类
Java标准库提供了两个常用的 List 实现:
| 实现类 | 底层结构 | 特点 |
|---|---|---|
ArrayList | 动态数组(Array) | 查询快,增删慢(需要移动元素) |
LinkedList | 双向链表(Doubly Linked List) | 插入删除快(前后指针调整),查询慢 |
❓ 该选 ArrayList 还是 LinkedList?
大多数情况下,推荐默认使用 ArrayList。
原因如下:
为什么 ArrayList 通常更快?
- 现代硬件(
CPU缓存技术)让数组的访问非常高效。 - 访问元素时,
ArrayList是连续内存,可以快速定位并加载数据。 - 相比之下,
LinkedList在遍历时需要不断指针跳转(Pointer Chasing),容易产生缓存未命中(Cache Miss),导致访问速度慢。
什么时候用 LinkedList 更合适?
虽然 ArrayList 通常更快,但在某些场景下,LinkedList 仍然有优势:
- 需要频繁在头尾插入/删除元素时(比如模拟栈(LIFO)或队列(FIFO)结构)
- 例如:
addFirst()removeFirst()addLast()removeLast()
这些操作在 LinkedList 中只需修改指针,效率非常高,而在 ArrayList 中需要整体移动元素。
️ 示例对比:ArrayList vs LinkedList
1. ArrayList 示例
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();list.add("one");list.add("two");list.add("three");System.out.println(list.get(1)); // 快速读取索引1的元素}}
特点:快速随机访问,但在开头插入或删除元素会比较慢(需要移动后续元素)。
2. LinkedList 示例
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> queue = new LinkedList<>();queue.addFirst("first");queue.addLast("last");System.out.println(queue.removeFirst()); // 快速移除第一个元素}}
特点:快速头尾操作,适合实现队列或栈结构。
️ 总结:选型建议
| 场景 | 建议实现 |
|---|---|
| 需要频繁按索引访问元素 | ArrayList |
| 需要频繁在开头或末尾插入/删除元素 | LinkedList |
| 绝大多数常规场景 | 优先选择 ArrayList |
✅ 一句话记忆:
“遍历、随机访问选 ArrayList,头尾操作选 LinkedList。”