理解 List 接口的核心特性:有序、可重复、支持索引访问
掌握 List 的常用操作方法(增删改查、遍历、搜索)
熟悉主要实现类(ArrayList、LinkedList、Vector)的性能差异与适用场景
能够根据业务需求选择合适的 List 实现
区分 List 与 Set 的本质区别
List 是 Java 集合框架中最重要的接口之一,继承自 Collection 接口。它代表一个有序的元素序列,具有以下关键特性:
维护插入顺序:元素按添加顺序存储
允许重复元素:同一个对象可多次出现
支持索引访问:可通过整数下标获取或修改元素
允许 null 值(具体行为依赖实现类)
支持双向遍历:通过 ListIterator 可前后移动

接口声明
public interface List<E> extends Collection<E>注意:不能直接实例化
List,必须使用其实现类(如ArrayList)创建对象。
List<String> languages = new ArrayList<>();
languages.add("Java");
languages.add("Python");性能提示:
若需频繁通过索引访问 → 选
ArrayList若需频繁在列表中间增删 → 选
LinkedList高并发场景 → 考虑
Collections.synchronizedList()或并发集合
List<String> list = new ArrayList<>();
// 尾部添加
list.add("Java"); // [Java]
// 指定位置插入(后续元素右移)
list.add(0, "Python"); // [Python, Java]
// 批量添加
list.addAll(Arrays.asList("C++", "Go")); // [Python, Java, C++, Go]注意:在索引
i处插入要求0 ≤ i ≤ size()。若i == size(),等价于尾部添加;若i > size(),抛出IndexOutOfBoundsException。
list.set(1, "JavaScript"); // 将索引 1 的元素替换为 "JavaScript"
// 结果: [Python, JavaScript, C++, Go]时间复杂度:O(1)(直接通过索引定位)
int firstIndex = list.indexOf("C++"); // 返回 2
int lastIndex = list.lastIndexOf("C++"); // 返回 2(无重复时相同)
int notFound = list.indexOf("Rust"); // 返回 -1indexOf():返回首次出现的索引
lastIndexOf():返回最后一次出现的索引
// 按索引删除
list.remove(0); // 删除 "Python",后续元素左移 → [JavaScript, C++, Go]
// 按值删除(仅删除第一个匹配项)
list.remove("C++"); // → [JavaScript, Go]注意:
remove(Object)与remove(int)是重载方法。若传入Integer,可能因自动装箱导致歧义,建议显式转换:list.remove((Object) 123); // 删除值为 123 的元素 list.remove(0); // 删除索引 0 的元素
String first = list.get(0);
String last = list.get(list.size() - 1);仅 List 及其子类型支持此操作,Collection 接口不提供
boolean hasJS = list.contains("JavaScript"); // true
boolean empty = list.isEmpty(); // false
int count = list.size(); // 2for (int i = 0; i < list.size(); i++) {
System.out.println(i + ": " + list.get(i));
}for (String lang : list) {
System.out.println(lang);
}Iterator<String> it = list.iterator();
while (it.hasNext()) {
String lang = it.next();
if (lang.equals("Go")) {
it.remove(); // 安全删除
}
}list.stream()
.filter(lang -> lang.startsWith("J"))
.forEach(System.out::println);经验法则:
默认使用
ArrayList仅当频繁在列表开头或中间插入 / 删除且不依赖随机访问时,考虑
LinkedList
List 是有序、可重复、支持索引访问的集合
核心实现:ArrayList(数组,快随机访问)、LinkedList(链表,快增删)
提供 add(index, e)、get(index)、set(index, e)、remove(index) 等索引操作
支持 indexOf() / lastIndexOf() 搜索、subList() 视图等高级功能
与 Set 的根本区别在于是否允许重复和是否有序
为什么 LinkedList 在已知节点位置时插入 / 删除是 O(1),但 list.add(1000, "X") 仍是 O(n)?请结合其内部结构解释。
ArrayList 的扩容机制是怎样的?默认初始容量是多少?如何避免频繁扩容带来的性能损耗?
假设你需要实现一个“最近使用记录”功能,最多保存 100 条,新记录插入头部,超出时删除尾部。你会选择哪种 List 实现?为什么?