List 是 Java 集合框架中有序、可重复的接口,继承自 Collection ,常用实现类有 ArrayList (数组实现)、 LinkedList (双向链表实现)、 Vector (线程安全,效率低)。
一、核心特点
1. 元素有序,按插入顺序存储,支持通过索引访问(索引从 0 开始)。
2. 允许存储重复元素,也可以存储 null ( ArrayList / LinkedList 支持, Vector 同理)。
3. 不同实现类底层结构不同,性能差异较大:
- ArrayList :查询快、增删慢(尾部增删除外),适合读多写少场景。
- LinkedList :查询慢、增删快,适合写多读少场景。
二、常用创建方式
java
// 1. 直接创建空 List
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new LinkedList<>();
// 2. 创建时初始化元素(JDK 9+ 支持)
List<String> list3 = List.of("A", "B", "C");
// 3. 基于已有集合创建
List<String> list4 = new ArrayList<>(Arrays.asList("X", "Y", "Z"));
注意: List.of() 创建的是不可变 List,不支持增删操作。
三、核心 API 操作
1. 增
java
List<String> list = new ArrayList<>();
list.add("Java"); // 尾部添加元素
list.add(1, "Python"); // 指定索引插入元素
list.addAll(Arrays.asList("C++", "Go")); // 批量添加集合元素
2. 删
java
list.remove(0); // 根据索引删除,返回被删元素
list.remove("Python"); // 根据元素删除,返回是否删除成功
list.clear(); // 清空所有元素
3. 改
java
list.set(1, "JavaScript"); // 修改指定索引的元素,返回原元素
4. 查
java
String elem = list.get(0); // 获取指定索引元素
int index = list.indexOf("Java"); // 获取元素首次出现的索引,不存在返回 -1
int lastIndex = list.lastIndexOf("Java"); // 获取元素末次出现的索引
boolean contains = list.contains("Go"); // 判断是否包含指定元素
int size = list.size(); // 获取元素个数
boolean isEmpty = list.isEmpty(); // 判断是否为空
四、遍历方式
java
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
// 1. 普通 for 循环(支持索引操作)
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 2. 增强 for 循环(简洁,无索引)
for (String s : list) {
System.out.println(s);
}
// 3. 迭代器(支持遍历中删除元素)
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.equals("B")) {
iterator.remove(); // 安全删除,不会触发 ConcurrentModificationException
}
}
// 4. Lambda 表达式(JDK 8+)
list.forEach(s -> System.out.println(s));
五、常见注意事项
1. ArrayList 扩容机制:默认初始容量 10,元素满时自动扩容为原容量的 1.5 倍,频繁扩容会消耗性能,可通过 new ArrayList<>(initialCapacity) 指定初始容量优化。
2. 遍历中删除元素:不能用增强 for 循环直接删除,需用迭代器或 JDK 8+ 的 removeIf() 方法。
3. 线程安全问题: ArrayList 和 LinkedList 是线程不安全的,多线程环境下可使用 Collections.synchronizedList(list) 或 CopyOnWriteArrayList 。

1796

被折叠的 条评论
为什么被折叠?



