ArrayList比数组更实用,因能自动扩容、避免类型错误;Course需含id/name/credit字段并重写toString();查重须trim()后equals();排序用Comparator避免溢出;文件保存需UTF-8编码遍历格式化。

用 ArrayList 存课程对象比数组更实用
硬编码数组长度容易出错,增删课程时还得手动搬数据。ArrayList 能自动扩容,配合泛型还能避免类型转换错误。别用 ArrayList 或裸类型,否则编译期就失去约束。
-
Course类至少要有id、name、credit三个字段,建议加toString()方便调试 - 初始化时用
new ArrayList(),别写成new ArrayList()(会触发原始类型警告) - 删除课程别用
for (int i = 0; i 配合remove(i)—— 索引会偏移,漏删或越界
按课程名查重必须用 equals(),不是 ==
学生可能输“数据结构”和“数据结构 ”(尾部空格),直接 == 比较字符串永远返回 false。哪怕只查 name 字段,也要先 trim() 再 equals()。
public boolean existsByName(String name) {
String target = name == null ? "" : name.trim();
for (Course c : courses) {
if (target.equals(c.getName().trim())) {
return true;
}
}
return false;
}- 如果查重逻辑变复杂(比如忽略大小写),改用
equalsIgnoreCase() - 别在循环里反复调用
courses.get(i).getName().trim(),提前存局部变量 - 用
Stream写法虽简洁,但初学者容易写出list.stream().filter(...).findFirst().isPresent()这种低效写法——它会遍历全部元素
按学分排序要实现 Comparable 或传 Comparator
Collections.sort(courses) 不会自动按学分排,除非 Course 实现了 Comparable 并在 compareTo() 里比较 credit。更灵活的做法是临时传 Comparator:
Collections.sort(courses, (c1, c2) -> Integer.compare(c1.getCredit(), c2.getCredit()));
- 升序用
Integer.compare(a, b),降序用Integer.compare(b, a),别直接写a - b(整数溢出风险) - 如果排序字段可能为
null(比如未录入学分),用Comparator.nullsLast(Comparator.naturalOrder()) - 排序后原
ArrayList被修改,不需要额外赋值回变量
保存到文件时别用 PrintWriter.println(list)
直接打印整个 ArrayList 只会输出类似 [com.example.Course@1a2b3c4d, ...],毫无可读性。得遍历每个 Course,拼成 CSV 或 JSON 格式再写入。
立即学习“Java免费学习笔记(深入)”;
- 简单场景用 CSV:每行
id,name,credit,字段间用英文逗号,name含逗号时需加双引号并转义 - 别用
FileWriter而不指定编码,中文会变乱码;显式传StandardCharsets.UTF_8 - 用
try-with-resources包裹BufferedWriter,否则程序异常退出时文件可能为空或损坏
实际跑起来最常卡在查重逻辑和文件编码上,尤其是 Windows 下默认 ANSI 编码和 IDE 用 UTF-8 的冲突。先确保控制台能正确打印中文,再动文件读写。










