| 学习指南 EN
College Board · cb-cs-a · AP Computer Science A · ArrayList / ArrayList · 阅读约 15 分钟 · 更新于 2026-05-07

ArrayList (ArrayList) — AP Computer Science A CS A 学习指南

适合谁:AP Computer Science A 参加 AP Computer Science A 的考生。

覆盖内容:ArrayList概念、创建与使用方法、与普通数组的差异、核心操作方法、for-each循环遍历、求和/求极值/搜索等常用算法全部考纲要求子主题。

前置知识:基础 Java 或任何其他过程式语言编程。

关于练习题:下文「练习题」一节的所有题目均为我们按 AP Computer Science A 风格编写的原创题目 (original problems),仅用于教学。它们不是 College Board 真题的复制,措辞、数值或语境可能不同。请把它们当作练手用;评分细则请对照 College Board 官方 mark scheme。


1. 什么是ArrayList?

ArrayList 又称动态数组 (dynamic array),是Java集合框架 (Java Collections Framework) 中java.util包下的泛型 (generic) 类,是长度可动态调整的数组实现,专门解决普通数组长度固定、无法灵活增删元素的痛点。

在AP CS A考纲中,ArrayList属于Unit 7的核心考点,占卷面总分的7%~10%,选择题和自由作答题(FRQ)均会频繁考察,常和数组、类与对象等知识点结合出综合题。

2. 创建与使用ArrayList

使用ArrayList前必须先导入对应包,再通过泛型指定存储的元素类型(只能是引用类型,不能是int/double等基本类型):

  1. 导入包:import java.util.ArrayList;
  2. 声明格式:ArrayList<引用类型> 变量名 = new ArrayList<>();(Java 7及以上支持菱形语法,尖括号内可省略类型)
  3. 基本类型存储:如果要存基本类型,需要使用对应的包装类 (wrapper class),比如int对应Integerdouble对应Double,Java会自动完成装箱/拆箱操作。

使用范例:存储3名学生的数学考试分数

import java.util.ArrayList;
public class ScoreTest {
 public static void main(String[] args) {
 ArrayList<Integer> mathScores = new ArrayList<>();
 mathScores.add(89);
 mathScores.add(95);
 mathScores.add(78);
 System.out.println(mathScores); // 输出:[89, 95, 78]
 }
}

3. ArrayList与普通数组的对比

考试中经常考察两种存储结构的选型,核心差异如下表:

对比维度 普通数组 ArrayList
长度规则 声明时确定,后续不可修改 动态调整,增删元素时自动扩容
存储类型 支持基本类型、引用类型 仅支持引用类型,基本类型需用包装类
访问方式 数组名[索引]直接访问 get()/set()方法访问
长度获取 length属性 size()方法
适用场景 元素数量固定、不需要频繁增删 元素数量不确定、需要频繁插入/删除

考点提示:如果题目明确说明"班级固定有30名学生",优先选普通数组;如果说明"需要随时添加新报名的学生",优先选ArrayList。

4. 常用核心方法

AP CS A只考察以下5类核心方法,必须熟练掌握参数、返回值和边界规则:

方法签名 功能说明 注意事项
boolean add(E e) 在列表末尾添加元素e 永远返回true,无插入失败情况
void add(int index, E e) 在指定index位置插入元素e,原位置及后续元素后移 索引范围必须是0 ≤ index ≤ size(),否则抛出索引越界异常 (IndexOutOfBoundsException)
E remove(int index) 删除指定index位置的元素,返回被删除的元素 删除后后续元素自动前移,索引范围0 ≤ index < size()
E get(int index) 返回指定index位置的元素 索引范围0 ≤ index < size()
E set(int index, E e) index位置的元素替换为e,返回替换前的旧值 仅修改元素,不改变列表长度
int size() 返回列表中当前存储的元素个数 和数组的length属性完全不同,必须加括号调用

方法使用范例

ArrayList<String> names = new ArrayList<>();
names.add("张三"); // 末尾添加,列表:[张三]
names.add(0, "李四"); // 索引0插入,列表:[李四, 张三]
String oldName = names.set(1, "王五"); // oldName = "张三",列表:[李四, 王五]
String removed = names.remove(0); // removed = "李四",列表:[王五]
int count = names.size(); // count = 1

5. 用for-each循环遍历

for-each循环又称增强for循环 (enhanced for loop),是遍历集合和数组的简化写法,语法如下:

for(元素类型 变量名 : 遍历对象) {
 // 对变量的操作
}

优点:不需要手动维护索引,不会出现索引越界错误,代码简洁易读,适合仅需要读取元素的场景。 限制:遍历过程中不能修改列表的结构(不能调用add()/remove()方法),否则会抛出并发修改异常 (ConcurrentModificationException);也无法通过变量修改列表中存储的元素值。

遍历范例:输出所有分数的平均值

ArrayList<Integer> scores = new ArrayList<>();
// 省略添加元素的代码
int sum = 0;
for(int s : scores) {
 sum += s;
}
double avg = (double) sum / scores.size();

6. 常用ArrayList算法

ArrayList相关算法是FRQ的高频考点,必须熟练掌握以下4类基础算法的写法:

  1. 求和/平均值:初始化求和变量为0,遍历所有元素累加,平均值为总和除以元素个数。
  2. 求最大值/最小值:初始化最值为第一个元素,遍历所有元素,若当前元素比最值大/小则更新最值。
  3. 线性搜索 (linear search):遍历所有元素和目标值比较,找到则返回对应索引,遍历结束未找到返回-1。
  4. 筛选元素:新建空ArrayList,遍历原列表,把符合条件的元素添加到新列表中。

求最大值算法范例

public static int getMax(ArrayList<Integer> list) {
 int max = list.get(0); // 假设第一个元素是最大值
 for(int num : list) {
 if(num > max) {
 max = num;
 }
 }
 return max;
}

7. 常见陷阱 (Common Pitfalls)

  1. 混淆数组length属性和ArrayList的size()方法
  • 错误做法:用list.length获取ArrayList长度,编译报错
  • 原因:之前学习数组时习惯用length属性,混淆了属性和方法的区别
  • 正确做法:调用list.size()方法,必须加括号
  1. 声明ArrayList时使用基本类型作为泛型参数
  • 错误做法:ArrayList<int> list = new ArrayList<>(); 编译报错
  • 原因:不知道ArrayList只能存储引用类型,基本类型没有对应的引用地址
  • 正确做法:使用包装类,比如ArrayList<Integer> list = new ArrayList<>();
  1. for-each遍历过程中增删元素
  • 错误做法:遍历列表时调用remove()删除符合条件的元素,运行时抛出并发修改异常
  • 原因:for-each底层用迭代器实现,迭代器会校验列表修改次数,结构变化就会报错
  • 正确做法:使用普通for循环遍历,或者调用迭代器的remove()方法
  1. 索引越界错误
  • 错误做法:调用list.get(list.size())获取最后一个元素,抛出索引越界
  • 原因:忽略Java中索引从0开始的规则,最后一个元素的索引是size()-1
  • 正确做法:索引的合法范围是0 ≤ 索引 < list.size()

8. 练习题 (AP Computer Science A 风格)

题目1

现有存储整数的ArrayList<Integer> nums,初始内容为[3, 7, 12, 15, 19],依次执行以下代码后,nums的最终内容是什么?

nums.add(2, 9);
nums.set(4, 16);
nums.remove(5);

解答

  1. 第一步add(2,9):在索引2的位置插入9,原索引2及之后的元素后移,列表变为[3,7,9,12,15,19]
  2. 第二步set(4,16):把索引4的15替换为16,列表变为[3,7,9,12,16,19]
  3. 第三步remove(5):删除索引5的19,后续元素前移,最终内容为[3,7,9,12,16]

题目2

编写方法countPass,参数为存储学生分数的ArrayList<Integer> scores(分数范围0~100),返回分数≥60的学生人数。 解答

public static int countPass(ArrayList<Integer> scores) {
 int count = 0;
 for(int s : scores) {
 if(s >= 60) {
 count++;
 }
 }
 return count;
}

说明:使用for-each遍历所有元素,符合条件则计数累加,不需要修改列表结构,适合用for-each实现。

题目3

以下关于ArrayList的说法正确的是? A. ArrayList的长度是固定的,声明时必须指定大小 B. 可以用list[0]直接获取ArrayList的第一个元素 C. ArrayList<Double>可以直接存储double类型的数值 D. 仅需要遍历读取元素时,优先使用for-each循环 解答:正确答案为D。

  • A错误:ArrayList长度动态,不需要声明时指定大小
  • B错误:ArrayList只能用get()方法获取元素,不能用[]访问
  • C错误:ArrayList<Double>实际存储的是Double包装类对象,存入double是Java自动装箱的语法糖,不是直接存储基本类型
  • D正确:for-each代码简洁,不会出现索引越界,适合读取场景

9. 速查表 (Quick Reference Cheatsheet)

操作类型 代码/规则
导包 import java.util.ArrayList;
声明 ArrayList<引用类型> 变量名 = new ArrayList<>();
末尾加元素 list.add(element);
指定索引插入 list.add(index, element);
删除指定索引元素 list.remove(index);
获取元素 list.get(index);
替换元素 list.set(index, newElement);
获取元素个数 list.size();
遍历读取 for(Type t : list) { 操作 }
核心注意点 索引范围0 ≤ index < size(),for-each遍历时不能增删元素,仅支持引用类型

10. 接下来怎么学

ArrayList是AP CS A后续学习其他集合类(比如LinkedList、HashMap)的基础,也是FRQ的高频考点,常和2D数组、类与对象、继承等知识点结合出综合题。掌握本单元内容后,你可以直接进入Unit 8 二维数组的学习,同时建议多刷近5年FRQ中ArrayList相关的题目,熟练掌握各类算法的标准写法。

如果你在练习过程中遇到任何考点疑问或者不会做的题目,都可以随时来小欧提问,我们会为你提供针对性的讲解和练习方案。

← 返回章节主页

某道题卡住了?
拍照或粘贴题目 — 小欧(我们的 AI 学习助手)会一步步讲解并配示意图。
免费试用小欧 →