什么是 ArrayList?
ArrayList 是一个动态数组的实现,它是一个可以动态改变大小的数组,也就是说,你可以在运行时向其中添加或删除元素,而无需像普通数组那样预先指定大小。

它的核心特点:
- 有序:元素按照你添加的顺序存储(即插入顺序)。
- 可重复:可以存储多个相同的元素。
- 动态扩容:当元素数量超过当前容量时,
ArrayList会自动扩容(通常是创建一个更大的新数组,并将旧数组元素复制过去)。 - 非线程安全:在多线程环境下,如果多个线程同时修改一个
ArrayList,可能会导致数据不一致,如果需要线程安全,可以使用Vector或Collections.synchronizedList()包装。
ArrayList 元素的核心操作
下面我们通过代码示例来学习如何对 ArrayList 的元素进行各种操作。
创建 ArrayList 并指定元素类型
使用泛型 <> 来指定 ArrayList 中可以存储的元素类型,这保证了类型安全。
import java.util.ArrayList; // 创建一个只能存储 String 类型元素的 ArrayList ArrayList<String> stringList = new ArrayList<>(); // 创建一个只能存储 Integer 类型元素的 ArrayList ArrayList<Integer> numberList = new ArrayList<>(); // 创建时指定初始容量(可选) // ArrayList<Integer> bigList = new ArrayList<>(100); // 初始容量为100
添加元素
使用 add() 方法向列表末尾添加元素。

stringList.add("Apple");
stringList.add("Banana");
stringList.add("Orange");
// 在指定位置插入元素
stringList.add(1, "Grape"); // 在索引 1 的位置插入 "Grape"
System.out.println("当前列表: " + stringList);
// 输出: 当前列表: [Apple, Grape, Banana, Orange]
访问元素
通过索引(从 0 开始)来访问元素。
// 获取指定索引的元素
String firstFruit = stringList.get(0); // 获取索引为 0 的元素 "Apple"
System.out.println("第一个水果是: " + firstFruit);
// 获取列表大小(元素个数)
int size = stringList.size();
System.out.println("列表中共有 " + size + " 种水果");
修改元素
通过索引来修改指定位置的元素。
// 修改指定索引的元素
stringList.set(2, "Peach"); // 将索引 2 的元素 "Banana" 修改为 "Peach"
System.out.println("修改后的列表: " + stringList);
// 输出: 修改后的列表: [Apple, Grape, Peach, Orange]
删除元素
有多种删除方式:
// a. 删除指定索引的元素
stringList.remove(1); // 删除索引 1 的元素 "Grape"
// b. 删除第一个匹配的指定元素(注意:这里比较的是值,不是索引)
boolean removed = stringList.remove("Orange"); // 删除元素 "Orange"
System.out.println("是否成功删除 'Orange': " + removed);
System.out.println("删除后的列表: " + stringList);
// 输出: 删除后的列表: [Apple, Peach]
检查元素是否存在
使用 contains() 方法检查列表中是否包含某个元素。

boolean hasApple = stringList.contains("Apple");
boolean hasGrape = stringList.contains("Grape");
System.out.println("列表中是否有 'Apple': " + hasApple); // true
System.out.println("列表中是否有 'Grape': " + hasGrape); // false
ArrayList 元素的遍历
遍历是处理列表中每个元素的常见操作,主要有以下几种方式:
使用 for 循环(通过索引)
这是最传统的方式,适用于需要知道当前元素索引的场景。
System.out.println("--- 使用 for 循环遍历 ---");
for (int i = 0; i < stringList.size(); i++) {
String fruit = stringList.get(i);
System.out.println("索引 " + i + ": " + fruit);
}
使用增强 for 循环(for-each)
这是最简洁、最推荐的方式,适用于只需要元素的值,不需要索引的场景。
System.out.println("--- 使用 for-each 循环遍历 ---");
for (String fruit : stringList) {
System.out.println("水果: " + fruit);
}
使用迭代器
迭代器是一种更安全、更专业的遍历方式,尤其是在遍历过程中需要删除元素时,使用 for-each 循环删除元素会抛出 ConcurrentModificationException 异常。
System.out.println("--- 使用迭代器遍历 ---");
// 创建迭代器
java.util.Iterator<String> iterator = stringList.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println("迭代器获取的水果: " + fruit);
// 示例:如果水果是 "Peach",就删除它
if ("Peach".equals(fruit)) {
iterator.remove(); // 使用迭代器的 remove 方法,而不是 list.remove()
}
}
System.out.println("迭代器删除后的列表: " + stringList);
// 输出: 迭代器删除后的列表: [Apple]
实际应用示例:学生名单管理
让我们用一个完整的例子来巩固这些知识。
import java.util.ArrayList;
public class StudentListManager {
public static void main(String[] args) {
// 1. 创建一个存储学生姓名的 ArrayList
ArrayList<String> studentList = new ArrayList<>();
// 2. 添加学生
System.out.println("正在添加学生...");
studentList.add("张三");
studentList.add("李四");
studentList.add("王五");
studentList.add(1, "赵六"); // 在李四前面插入赵六
System.out.println("当前学生名单: " + studentList);
// 3. 查看学生
System.out.println("\n查看学生信息:");
System.out.println("第一位学生是: " + studentList.get(0));
System.out.println("总共有 " + studentList.size() + " 名学生。");
// 4. 修改学生信息
System.out.println("\n修改学生信息:");
studentList.set(3, "孙七"); // 将王五改为孙七
System.out.println("修改后的名单: " + studentList);
// 5. 删除学生
System.out.println("\n删除学生:");
studentList.remove("赵六"); // 按姓名删除
System.out.println("删除赵六后的名单: " + studentList);
// 6. 遍历并打印所有学生
System.out.println("\n--- 遍历所有学生 ---");
for (String student : studentList) {
System.out.println("学生姓名: " + student);
}
// 7. 检查学生是否存在
System.out.println("\n检查学生是否存在:");
boolean hasZhangSan = studentList.contains("张三");
System.out.println("名单中是否有张三? " + hasZhangSan);
}
}
| 操作 | 方法 | 描述 |
|---|---|---|
| 创建 | new ArrayList<>() |
创建一个空的 ArrayList。 |
| 添加 | add(E element) |
在列表末尾添加元素。 |
add(int index, E element) |
在指定索引位置插入元素。 | |
| 访问 | get(int index) |
获取指定索引的元素。 |
size() |
获取列表中元素的个数。 | |
| 修改 | set(int index, E element) |
修改指定索引的元素。 |
| 删除 | remove(int index) |
删除指定索引的元素。 |
remove(Object o) |
删除第一个匹配的指定元素。 | |
| 检查 | contains(Object o) |
检查列表中是否包含某个元素。 |
| 遍历 | for 循环 (索引) |
通过索引访问每个元素。 |
for-each 循环 |
简洁地遍历每个元素。 | |
Iterator |
安全地遍历,并在遍历时删除元素。 |
掌握 ArrayList 元素的这些基本操作,是进行更复杂 Java 开发的基础。
