一、List 接口简介
List 是Collection 的子接口(单列集合)✅ List 三大核心特点:
- 有序:存入顺序和取出顺序一致
- 可重复:允许存储重复元素
- 有索引:支持根据索引操作元素(这是 List 独有的!Set 没有索引)
继承关系:
List extends Collection所以 Collection 里所有方法,List 全都可以用,同时 List 新增一套带索引的专属方法
List 特有方法
| 方法 | 作用 |
|---|---|
void add(int index, E element) | 在指定索引位置插入元素 |
E get(int index) | 根据索引获取元素 |
E remove(int index) | 根据索引删除元素,返回被删掉的元素 |
E set(int index, E element) | 修改指定索引位置的元素,返回旧值 |
⚠️ 重点坑点:remove有两个重载
remove(int index):List 独有,按索引删remove(Object o):继承自 Collection,按元素对象删如果存 Integer 集合,直接写list.remove(1)会优先识别成索引!想删除元素 1 要写list.remove(Integer.valueOf(1))
List 的遍历方式(4 种,包含 Lambda)
- 迭代器 Iterator
- 增强 for 循环 for-each
- 普通 for 循环(因为有索引,List 专属)
forEach + Lambda / 方法引用
list.forEach(s -> System.out.println(s)); list.forEach(System.out::println); // 方法引用简写二、ArrayList(List 最常用实现类)
底层:可变数组(Object [] 数组)特点:
- 查询快:底层数组,通过索引直接定位
- 增删慢:中间插入 / 删除元素,后面元素需要移位
- 线程不安全,多线程环境不推荐使用
- 可以存 null 元素
1. 底层扩容机制(高频考点)
- JDK8:空参构造创建 ArrayList 时,初始是空数组;第一次 add 的时候,才初始化容量为 10
- 容量满了之后,自动扩容:新容量 = 原容量 * 1.5 倍
- 如果一次性添加很多元素,超过 1.5 倍,直接使用需要的目标容量
2. 常用代码示例
import java.util.ArrayList; import java.util.List; public class TestList { public static void main(String[] args) { // 多态写法:List接口指向ArrayList实现类 List<String> list = new ArrayList<>(); // 继承Collection的add list.add("苹果"); list.add("香蕉"); list.add("橙子"); System.out.println(list); // List特有:根据索引插入 list.add(1,"葡萄"); System.out.println(list); // get 根据索引取值 System.out.println(list.get(2)); // set 修改索引位置元素 String old = list.set(0,"西瓜"); System.out.println("被替换的值:"+old); System.out.println(list); // remove 按索引删除 String del = list.remove(3); System.out.println("删掉的元素:"+del); System.out.println(list); // Lambda遍历 list.forEach(System.out::println); } }3. 适用场景
✅ 适合:大量查询、遍历,增删操作少的场景 ❌ 不适合:频繁在中间位置插入、删除元素
4. 易错总结
- ArrayList 是实现类,实现了 List 接口
- 有序、可重复、有索引
- 底层数组,查询快、中间增删慢
- 扩容 1.5 倍;空参构造不会立刻创建长度 10 数组,JDK8 是懒加载
- 线程不安全,不同步
三、List 体系小结
List 接口规定:有序、可重复、带索引; ArrayList:数组实现,查询优先,开发中用得最多。