Java课程管理系统需实现课程、学生、教师的增删改查及真实关联;推荐双存课程数据(ArrayList维持顺序+HashMap按ID快速查找);学生选课须后端校验去重并同步更新课程状态;控制台中文乱码需统一JVM、Scanner及IDE编码为UTF-8;方法应返回空集合而非null以防NPE;退课等操作须保证多表关系一致性与事务原子性。

Java课程管理系统不是靠“综合解析”就能跑起来的,它得先能增删改查课程、学生、教师三类核心对象,并让它们之间产生真实关联(比如某学生选了某课程)。下面直奔实操要点。
用ArrayList还是HashMap存课程数据?
初学者常把所有课程塞进一个ArrayList,结果查课名要遍历、按ID取课要再遍历——O(n)太伤。实际应双存:一个ArrayList维持插入顺序(用于列表展示),一个HashMap以courseId为键(用于快速定位)。注意HashMap的key必须是不可变对象,用Integer比用int更安全,避免自动装箱引发的null问题。
常见错误:用String做课程ID(如"CS101")却没重写Course类的equals()和hashCode(),导致HashMap查不到。
学生选课时怎么避免重复添加?
不能只靠前端按钮禁用,后端必须校验。典型做法是在Student类里加一个Set,每次调用selectCourse(int courseId)前先检查selectedCourseIds.contains(courseId)。用Set而非List,天然去重且查找是O(1)。
立即学习“Java免费学习笔记(深入)”;
容易踩的坑:
-
selectedCourseIds未初始化,直接add()会抛NullPointerException - 选课成功后只更新了
Student对象,忘了同步更新Course里的studentCount或enrolledStudents列表 - 没做事务控制,多线程同时选同一门课可能导致超限(比如课程限30人,第31人仍成功)
控制台输入中文乱码怎么办?
Windows下用Scanner读中文,常出现“???”——这不是代码逻辑问题,是终端编码不匹配。关键在两处:
运行时指定JVM参数:-Dfile.encoding=UTF-8;
创建Scanner时显式指定编码:new Scanner(System.in, "UTF-8")。
如果用IDE(如IntelliJ),还需检查:File → Settings → Editor → File Encodings里全局编码、项目编码、默认编码三者是否均为UTF-8;终端(Terminal)的编码设置是否也一致。少设一处,中文就断一环。
为什么List返回null而不是空集合?
这是最隐蔽的空指针源头。比如CourseService.getCoursesByTeacherId(int tid)方法,内部查数据库没找到记录,直接return null。调用方若写for (Course c : service.getCoursesByTeacherId(101)),立刻NullPointerException。
正确做法:永远返回空集合,不返回null。即:
public ListgetCoursesByTeacherId(int tid) { List result = dao.findCoursesByTeacherId(tid); return result != null ? result : Collections.emptyList(); }
Collections.emptyList()是不可变的,安全;别用new ArrayList(),除非后续要修改。
课程管理系统真正的复杂点不在功能数量,而在关系一致性——学生退课时,课程人数要减、成绩记录要删、教师授课统计要更新。这些操作一旦分散在不同方法里,又没统一入口控制,很快就会出现数据对不上。动手前,先想清楚哪几个动作必须原子执行。









