List 接口与实现
List 是 Collection 的子接口,表示有序、可重复的元素序列。
List 接口特点
| 特性 | 说明 |
|---|---|
| 有序 | 元素按插入顺序存储,有索引 |
| 可重复 | 允许存储重复元素 |
| 可null | 允许存储 null 元素 |
| 索引访问 | 通过索引快速定位元素 |
List 核心方法
Java
// 添加
list.add(element); // 尾部添加
list.add(index, element); // 指定位置插入
list.addAll(otherList); // 添加另一个集合
// 获取
list.get(index); // 获取指定位置元素
list.indexOf(element); // 获取元素首次出现位置
list.lastIndexOf(element); // 获取元素最后出现位置
// 删除
list.remove(index); // 删除指定位置元素
list.remove(element); // 删除首次出现的元素
list.clear(); // 清空
// 修改
list.set(index, element); // 替换指定位置元素
// 遍历
list.iterator(); // 获取迭代器
list.listIterator(); // 获取双向迭代器
ArrayList
特点
- 基于动态数组实现
- 查询快:索引直接访问 O(1)
- 插入删除慢:需要移动元素 O(n)
- 默认容量 10,扩容 1.5 倍
使用示例
Java
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
String first = list.get(0); // "A"
list.set(1, "D"); // 替换为 "D"
list.remove(2); // 删除第 2 个
// 遍历
for (String s : list) {
System.out.println(s);
}
// 函数式遍历(Java 8+)
list.forEach(System.out::println);
扩容机制:容量不足时扩容为原来的 1.5 倍,可通过
new ArrayList<>(initialCapacity)设置初始容量避免频繁扩容。
LinkedList
特点
- 基于双向链表实现
- 插入删除快:只需修改指针 O(1)
- 查询慢:需要遍历链表 O(n)
- 实现 List 和 Deque 接口
使用示例
Java
LinkedList<String> list = new LinkedList<>();
list.add("A"); // 尾部添加
list.addFirst("B"); // 头部添加
list.addLast("C"); // 尾部添加
String first = list.getFirst(); // 获取头部
String last = list.getLast(); // 获取尾部
list.removeFirst(); // 删除头部
list.removeLast(); // 删除尾部
ArrayList vs LinkedList
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问 | O(1) 快 | O(n) 慢 |
| 头部插入 | O(n) 慢 | O(1) 快 |
| 尾部插入 | O(1) 快 | O(1) 快 |
| 中间插入 | O(n) 慢 | O(n) 慢(需遍历定位) |
| 内存占用 | 连续数组,紧凑 | 每元素需存储前后指针 |
选择原则:频繁随机访问用 ArrayList,频繁头部插入删除用 LinkedList。
Vector
特点
- ArrayList 的线程安全版本
- 所有方法 synchronized 同步
- 性能较低,一般不推荐
Java
List<String> vector = new Vector<>(); // 同步的 ArrayList
替代方案:需要线程安全时,用
Collections.synchronizedList(new ArrayList<>())或CopyOnWriteArrayList。
要点总结
- List:有序、可重复、索引访问
- ArrayList:数组实现,查询快,插入删除慢
- LinkedList:链表实现,插入删除快,查询慢
- 频繁查询用 ArrayList,频繁插入删除用 LinkedList
- Vector 是同步版本,性能低,不推荐
- 遍历推荐 for-each 或 forEach() 方法
📝 发现内容有误?点击此处直接编辑