235. Java 集合 - 深入理解 Collection 扩展 —— List 接口 - 指南

235. Java 集合 - 深入理解 Collection 扩展 —— List 接口

在 Collection 框架中,List 是一个非常重要的子接口,它在基本集合(Collection)之上,带来了两大核心增强功能:


List 接口的两个关键特性

  1. 元素顺序有保障
    • List 中,元素的顺序永远是确定的!
    • 遍历时,元素的顺序和它们被添加的顺序一致。
  2. 元素有索引(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));  // Apple
  System.out.println("Second element: " + fruits.get(1)); // Banana
  for (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。”

posted @ 2025-12-10 15:28  yangykaifa  阅读(0)  评论(0)    收藏  举报