Java.util.List 使用详解
java.util.List
是 Java 集合框架中最常用的接口之一,它表示一个有序的集合(也称为序列)。下面我将详细介绍 List 的使用方法,包括创建、操作和最佳实践。
一、List 的创建
1. 使用具体实现类创建
// ArrayList - 基于动态数组
List<String> arrayList = new ArrayList<>();
// LinkedList - 基于链表
List<Integer> linkedList = new LinkedList<>();
// Vector - 线程安全的动态数组(已过时,不推荐新代码使用)
List<Double> vector = new Vector<>();
2. 使用工具方法创建
// Arrays.asList - 固定大小的List(不能添加/删除)
List<String> fixedList = Arrays.asList("A", "B", "C");
// List.of (Java 9+) - 不可变List
List<String> immutableList = List.of("A", "B", "C");
// Collections.nCopies - 创建包含n个相同元素的List
List<String> repeated = Collections.nCopies(3, "Hello");
二、基本操作
1. 添加元素
List<String> fruits = new ArrayList<>();
// 添加单个元素
fruits.add("Apple");
fruits.add("Banana");
// 在指定位置插入
fruits.add(1, "Orange"); // ["Apple", "Orange", "Banana"]
// 添加多个元素
fruits.addAll(Arrays.asList("Grape", "Mango"));
2. 访问元素
// 获取元素
String first = fruits.get(0); // "Apple"
// 检查元素是否存在
boolean hasApple = fruits.contains("Apple"); // true
// 查找元素位置
int index = fruits.indexOf("Banana"); // 2
int lastIndex = fruits.lastIndexOf("Apple"); // 0
3. 修改元素
// 修改指定位置元素
fruits.set(1, "Cherry"); // ["Apple", "Cherry", "Banana", "Grape", "Mango"]
// 批量替换 (Java 8+)
fruits.replaceAll(String::toUpperCase); // ["APPLE", "CHERRY", "BANANA", "GRAPE", "MANGO"]
4. 删除元素
// 按索引删除
fruits.remove(0); // 移除 "APPLE"
// 按值删除
fruits.remove("CHERRY"); // 返回true表示成功
// 条件删除 (Java 8+)
fruits.removeIf(f -> f.startsWith("B")); // 删除所有B开头的元素
// 清空List
fruits.clear();
三、遍历操作
1. 基本遍历方式
// 1. for循环
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
// 2. 增强for循环
for (String fruit : fruits) {
System.out.println(fruit);
}
// 3. 迭代器
Iterator<String> it = fruits.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// 4. ListIterator (可双向遍历)
ListIterator<String> lit = fruits.listIterator();
while (lit.hasNext()) {
System.out.println(lit.next());
}
2. Java 8+ 流式遍历
// 简单遍历
fruits.forEach(System.out::println);
// 使用Stream API
fruits.stream()
.filter(f -> f.length() > 5)
.map(String::toLowerCase)
.forEach(System.out::println);
四、常用工具方法
1. 排序
// 自然排序
Collections.sort(fruits); // 按字母顺序
// 自定义排序
fruits.sort((a, b) -> b.compareTo(a)); // 降序
// 对象排序
List<Person> people = new ArrayList<>();
people.sort(Comparator.comparing(Person::getAge)
.thenComparing(Person::getName));
2. 子列表操作
// 获取子列表视图(与原List共享数据)
List<String> subList = fruits.subList(1, 3);
// 子列表修改会影响原List
subList.set(0, "Peach");
3. 数组转换
// List转数组
String[] array = fruits.toArray(new String[0]);
// 数组转List (Java 9+)
List<String> fromArray = List.of(array);
五、最佳实践
1. 初始化容量
// 如果知道大概元素数量,指定初始容量提高性能
List<String> bigList = new ArrayList<>(1000);
2. 不可变List
// Java 9+ 创建不可变List
List<String> immutable = List.of("A", "B", "C");
// Java 8及以前
List<String> immutable = Collections.unmodifiableList(new ArrayList<>(...));
3. 线程安全处理
// 同步包装
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
// 并发集合 (Java 5+)
List<String> safeList = new CopyOnWriteArrayList<>();
4. 性能考虑
- ArrayList:随机访问快(O(1)),中间插入/删除慢(O(n))
- LinkedList:插入/删除快(O(1)),随机访问慢(O(n))
六、Java 8+ 新特性应用
1. removeIf
// 删除所有空元素
list.removeIf(Objects::isNull);
2. replaceAll
// 所有元素转为大写
list.replaceAll(String::toUpperCase);
3. Stream API
// 复杂数据处理
List<String> result = list.stream()
.filter(s -> s.length() > 3)
.map(String::toLowerCase)
.distinct()
.collect(Collectors.toList());
List 是 Java 开发中最常用的集合类型,合理使用可以大大提高开发效率。选择适当的实现类(ArrayList/LinkedList)和遵循最佳实践,可以优化程序性能。