应使用student类封装学生信息并用arraylist管理,而非string拼接;需重写equals和hashcode以支持对象作hashmap键;遍历时删改元素须用iterator避免concurrentmodificationexception。

用 ArrayList 存学生对象,别用 String 拼成绩数据
很多人一上来就用 ArrayList<string></string> 存“张三,85,92,78”,后面查平均分、按总分排序全得手动切字符串、转数字、容错处理——这不是在写系统,是在给自己埋雷。
正确做法是定义一个 Student 类,字段包括 id、name、mathScore、englishScore、chineseScore,然后用 ArrayList<student></student> 管理:
public class Student {
private int id;
private String name;
private double mathScore;
private double englishScore;
private double chineseScore;
// 构造方法和 getter/setter(略)
}
- 所有计算逻辑(如
getTotalScore()、getAverage())直接封装在类里,调用时干净利落 - 增删改查都基于对象语义,比如
list.removeIf(s -> s.getId() == 1001),不是靠字符串匹配 - 避免运行时
NumberFormatException或空指针——只要构造时校验了字段,后续基本不会崩
HashMap 做 ID 快速查找,但别忘了重写 equals 和 hashCode
如果频繁按学号查学生(比如录入成绩时输入 ID 找人),用 ArrayList 遍历是 O(n),换成 HashMap<integer student></integer> 就是 O(1)。但有个关键前提:你没打算把 Student 当作 HashMap 的 key。
常见错误是这样写:Map<student string> scoreMap = new HashMap();</student>,结果发现两个内容相同的 Student 对象被当成不同 key——因为默认的 equals 比的是引用地址。
立即学习“Java免费学习笔记(深入)”;
- 如果真要用对象作 key(比如按姓名+班级组合查),必须重写
Student.equals()和Student.hashCode(),且只基于不可变字段(如id) - 更稳妥的做法是用
Integer(学号)作 key:Map<integer student> studentMap = new HashMap();</integer>,天然支持哈希定位 - 注意
HashMap不保证顺序,需要遍历时保持插入顺序?换LinkedHashMap
增删改操作要防 ConcurrentModificationException
遍历 ArrayList 时直接调用 remove() 或 add(),十有八九抛这个异常。比如想删掉所有不及格的学生:
// ❌ 错误示范:边遍历边删
for (Student s : list) {
if (s.getAverage() < 60) {
list.remove(s); // 这里爆
}
}
- 用迭代器的
remove()方法:Iterator<student> it = list.iterator(); while (it.hasNext()) { ... it.remove(); }</student> - 或者用
removeIf()(Java 8+):list.removeIf(s -> s.getAverage() ,简洁安全 - 修改操作(比如给某学生加 5 分)没问题,但注意:修改的是对象内部状态,不是集合结构,所以不触发异常
保存到文件用 ObjectOutputStream 要小心序列化兼容性
很多初学者用 ObjectOutputStream 直接把 ArrayList<student></student> 写进文件,下次启动再读回来,看似省事,实际隐患很大。
-
Student类必须实现Serializable接口,且最好显式声明private static final long serialVersionUID = 1L;,否则类结构稍一改动(比如加个字段),旧文件就读不出来,报InvalidClassException - 二进制文件不可读、不可跨语言、版本升级困难;真要持久化,优先考虑 CSV 或 JSON(用
Jackson或org.json库) - 如果坚持用序列化,至少加个 try-catch 包住
readObject(),并准备好降级方案(比如清空数据重新开始)
最常被忽略的一点:集合本身不是问题,问题是把业务逻辑和数据容器混在一起。比如在 Student 类里写“打印成绩单”方法,或者在主程序里反复手写循环算总分——这些该抽成独立工具类或服务方法,不然代码会随着需求变多迅速失控。










