一、创建和初始化
1. 创建 ArrayList
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>(50);
List<String> existingList = Arrays.asList("A", "B", "C");
ArrayList<String> list3 = new ArrayList<>(existingList);
var list4 = new ArrayList<Integer>();
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
2. 快速初始化
List<String> fixedList = List.of("A", "B", "C");
ArrayList<String> mutableList = new ArrayList<>(List.of("A", "B", "C"));
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "A", "B", "C");
二、添加元素
1. 基本添加操作
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
boolean added = list.add("Cherry");
list.add(1, "Orange");
list.addAll(List.of("Grape", "Mango"));
list.addAll(2, List.of("Pear", "Peach"));
三、访问和修改元素
1. 获取元素
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
String first = list.get(0);
String first2 = list.getFirst();
String last = list.getLast();
List<String> subList = list.subList(1, 3);
2. 修改元素
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C"));
String old = list.set(1, "BB");
四、删除元素
1. 按索引删除
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
String removed = list.remove(1);
2. 按元素删除
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C", "B"));
boolean removed = list.remove("B");
list.removeIf(s -> s.startsWith("A"));
list.removeAll(List.of("B", "C"));
list.retainAll(List.of("A", "D"));
3. 清空列表
list.clear();
五、查找和判断
1. 查找元素
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C", "B", "A"));
boolean hasA = list.contains("A");
boolean hasAll = list.containsAll(List.of("A", "B"));
int firstIndex = list.indexOf("B");
int lastIndex = list.lastIndexOf("B");
int notFound = list.indexOf("X");
2. 列表信息
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C"));
int size = list.size();
boolean empty = list.isEmpty();
六、遍历和迭代
1. 不同遍历方式
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C"));
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for (String item : list) {
System.out.println(item);
}
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
if ("B".equals(item)) {
iterator.remove();
}
}
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
list.forEach(item -> System.out.println(item));
list.forEach(System.out::println);
2. 并行遍历
list.parallelStream().forEach(item -> {
System.out.println(Thread.currentThread().getName() + ": " + item);
});
七、转换和操作
1. 转换为数组
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C"));
Object[] array1 = list.toArray();
String[] array2 = list.toArray(new String[0]);
String[] array3 = list.toArray(String[]::new);
2. 排序和反转
ArrayList<Integer> numbers = new ArrayList<>(List.of(3, 1, 4, 1, 5));
Collections.sort(numbers);
numbers.sort(Comparator.reverseOrder());
Collections.reverse(numbers);
Collections.shuffle(numbers);
八、Stream API 操作(Java 8+)
ArrayList<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
List<String> strings = numbers.stream()
.map(n -> "Number: " + n)
.collect(Collectors.toList());
long count = numbers.stream().count();
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
Optional<Integer> max = numbers.stream().max(Integer::compare);
Map<Boolean, List<Integer>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n > 3));
九、容量和性能
1. 容量管理
ArrayList<String> list = new ArrayList<>();
list.ensureCapacity(100);
list.trimToSize();
2. 性能提示
ArrayList<String> list = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) {
list.add("item" + i);
}
list.addAll(Collections.nCopies(1000, "item"));
for (int i = 0; i < list.size(); i++) {
list.get(i);
}
十、线程安全处理
1. 同步包装
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
synchronized(syncList) {
syncList.add("item");
for (String item : syncList) {
System.out.println(item);
}
}
2. CopyOnWriteArrayList(读多写少场景)
import java.util.concurrent.CopyOnWriteArrayList;
CopyOnWriteArrayList<String> safeList = new CopyOnWriteArrayList<>();
safeList.add("item");
十一、实际应用示例
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<Integer> scores = new ArrayList<>();
scores.add(85);
scores.add(92);
scores.add(78);
double average = scores.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
class ShoppingCart {
private ArrayList<String> items = new ArrayList<>();
public void addItem(String item) {
items.add(item);
}
public void removeItem(String item) {
items.remove(item);
}
public List<String> getItems() {
return new ArrayList<>(items);
}
}
ArrayList<String> rawData = new ArrayList<>(
List.of("apple", "banana", "cherry", "date", "elderberry")
);
List<String> processed = rawData.stream()
.filter(s -> s.length() > 5)
.map(String::toUpperCase)
.collect(Collectors.toList());
}
}
十二、常见问题及解决
1. ConcurrentModificationException
ArrayList<String> list = new ArrayList<>(List.of("A", "B", "C"));
for (String item : list) {
if ("B".equals(item)) {
list.remove(item);
}
}
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("B".equals(it.next())) {
it.remove();
}
}
list.removeIf(item -> "B".equals(item));
2. 空值处理
ArrayList<String> list = new ArrayList<>();
list.add(null);
if (list.contains(null)) {
System.out.println("列表包含null");
}
总结要点
- 动态数组:自动扩容,初始容量10,每次扩容1.5倍
- 随机访问:
get(index) 是 O(1) 时间复杂度
- 非线程安全:多线程环境需要外部同步
- 允许null:可以存储null元素
- 快速失败:迭代器是快速失败的
- 性能优化:预分配容量,批量操作
- 现代用法:结合Stream API进行函数式操作