Java基础快速入门:基于ArrayList从零打造学生管理系统
本文纲要
- 项目概述与运行效果
- 整体设计思路
- 第一步:编写学生实体类 Student
- 第二步:搭建主菜单与无限循环
- 第三步:实现添加学生功能
- 第四步:实现查看所有学生
- 第五步:抽取“根据学号查找索引”的方法
- 第六步:实现删除学生功能
- 第七步:实现修改学生功能
- 第八步:完善添加学生——学号唯一性校验
- 完整代码与测试
- 总结
项目概述与运行效果
我们将在控制台上实现一个 学生管理系统,提供以下功能菜单:
--------欢迎来到学生管理系统--------
1 添加学生
2 删除学生
3 修改学生
4 查看学生
5 退出
请输入您的选择:
- 添加学生:输入学号、姓名、年龄、生日,学号不可重复。
- 删除学生:根据学号删除学生,若学号不存在则给出提示。
- 修改学生:根据学号修改学生的姓名、年龄、生日(学号不变)。
- 查看所有学生:以表格形式展示全部学生信息。
- 退出系统:结束程序。
主要技术点:使用 ArrayList 存储学生对象,通过 Scanner 接收键盘输入,switch 匹配菜单选项,以及循环标号控制程序退出。
整体设计思路
系统围绕一个 ArrayList<Student> 集合展开,所有增删改查操作都基于该集合
核心步骤:
- 定义
Student类封装学生信息 - 创建
ArrayList<Student>集合容器 - 编写主菜单无限循环,通过
Scanner读取选项并转入对应方法 - 实现增、删、改、查四个方法,均操作同一个
list对象 - 提供一个工具方法
getIndex,根据学号返回元素在集合中的索引(不存在则返回 -1) - 第一步:编写学生实体类
Student
将学生的学号、姓名、年龄、生日封装为一个 Student 类,包含私有属性、构造方法和 getter/setter。
package com.wb.domain;
public class Student {
private String sid; // 学号
private String name; // 姓名
private int age; // 年龄
private String birthday; // 生日
public Student() {}
public Student(String sid, String name, int age, String birthday) {
this.sid = sid;
this.name = name;
this.age = age;
this.birthday = birthday;
}
public String getSid() { return sid; }
public void setSid(String sid) { this.sid = sid; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public String getBirthday() { return birthday; }
public void setBirthday(String birthday) { this.birthday = birthday; }
}
第二步:搭建主菜单与无限循环
在 main 方法中创建集合和扫描器,使用 while(true) 配合带标号的 break 实现菜单循环
用户输入 5 时退出
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> list = new ArrayList<>();
lo:
while (true) {
System.out.println("--------欢迎来到学生管理系统--------");
System.out.println("1 添加学生");
System.out.println("2 删除学生");
System.out.println("3 修改学生");
System.out.println("4 查看学生");
System.out.println("5 退出");
System.out.println("请输入您的选择:");
String choice = sc.next();
switch (choice) {
case "1":
addStudent(list);
break;
case "2":
deleteStudent(list);
break;
case "3":
updateStudent(list);
break;
case "4":
queryStudents(list);
break;
case "5":
System.out.println("感谢您的使用");
break lo; // 跳出标号 lo 的 while 循环
default:
System.out.println("您的输入有误");
break;
}
}
}
关键点:
使用 String choice = sc.next(); 接收菜单选项,避免与后续 nextInt() 混用引发问题break lo; 直接退出外层 while(true) 循环,结束程序
第三步:实现添加学生功能
添加学生方法的基本逻辑:提示并接收学号、姓名、年龄、生日,封装为 Student 对象,加入 list,最后提示添加成功。
public static void addStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入学号:");
String sid = sc.next();
System.out.println("请输入姓名:");
String name = sc.next();
System.out.println("请输入年龄:");
int age = sc.nextInt();
System.out.println("请输入生日:");
String birthday = sc.next();
Student stu = new Student(sid, name, age, birthday);
list.add(stu);
System.out.println("添加成功!");
}
注意:此时还未加学号唯一性校验,会在第 8 步完善
第四步:实现查看所有学生
查看学生时,先判断集合是否为空;若为空直接提示并返回,否则打印表头并遍历集合输出
public static void queryStudents(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("无信息,请添加后重新查询");
return;
}
System.out.println("学号\t\t姓名\t年龄\t生日");
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getSid() + "\t" + stu.getName() +
"\t" + stu.getAge() + "\t\t" + stu.getBirthday());
}
}
使用 \t 制表符使输出对齐
第五步:抽取“根据学号查找索引”的方法
删除和修改都需要根据学号定位元素的位置
我们编写一个通用的 getIndex 方法:
- 遍历集合,比较每个学生的学号与目标学号
- 若找到,返回索引位置;若遍历结束仍未找到,返回 -1
public static int getIndex(ArrayList<Student> list, String sid) {
int index = -1;
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
if (stu.getSid().equals(sid)) {
index = i;
}
}
return index;
}
这个方法后续会在删除、修改以及添加(学号查重)中复用
第六步:实现删除学生功能
根据用户输入的学号,调用 getIndex 查找索引。若返回 -1 则提示“查无信息”,否则调用 list.remove(index) 删除
public static void deleteStudent(ArrayList<Student> list) {
System.out.println("请输入您要删除的学生学号:");
Scanner sc = new Scanner(System.in);
String deleteSid = sc.next();
int index = getIndex(list, deleteSid);
if (index == -1) {
System.out.println("查无信息,请重新输入");
} else {
list.remove(index);
System.out.println("删除成功!");
}
}
第七步:实现修改学生功能
流程与删除相似:输入要修改的学号 → 找到索引 → 若存在,继续输入新的姓名、年龄、生日,封装新对象,调用 list.set(index, newStudent)
public static void updateStudent(ArrayList<Student> list) {
System.out.println("请输入您要修改的学生学号:");
Scanner sc = new Scanner(System.in);
String updateSid = sc.next();
int index = getIndex(list, updateSid);
if (index == -1) {
System.out.println("查无信息,请重新输入");
} else {
System.out.println("请输入新的学生姓名:");
String name = sc.next();
System.out.println("请输入新的学生年龄:");
int age = sc.nextInt();
System.out.println("请输入新的学生生日:");
String birthday = sc.next();
Student stu = new Student(updateSid, name, age, birthday);
list.set(index, stu);
System.out.println("修改成功!");
}
}
第八步:完善添加学生——学号唯一性校验
初始的添加方法没有判断学号重复。现在需要用 getIndex 进行校验:
- 用户输入学号后,若返回 -1 则可用,跳出循环继续录入其他信息;
- 若返回非 -1,则提示“学号已被占用”,要求重新输入,形成 学号输入死循环。
改进步骤:
- 将学号输入语句放入 while(true) 中。
- 在循环内调用 getIndex 判断是否存在。
- 若不存在(返回 -1),执行 break 退出循环;否则继续循环。
- 提升 sid 变量的作用域,将其声明在 while 之前。
最终 addStudent 方法修正为:
public static void addStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
String sid;
while (true) {
System.out.println("请输入学号:");
sid = sc.next();
int index = getIndex(list, sid);
if (index == -1) { // 学号不存在,可用
break;
} else {
// 学号已存在,提示后继续循环让用户重新输入
System.out.println("学号已被占用,请重新输入");
}
}
System.out.println("请输入姓名:");
String name = sc.next();
System.out.println("请输入年龄:");
int age = sc.nextInt();
System.out.println("请输入生日:");
String birthday = sc.next();
Student stu = new Student(sid, name, age, birthday);
list.add(stu);
System.out.println("添加成功!");
}
至此,添加学生便具备了学号唯一性控制
完整代码与测试
将以上所有代码整合后结构如下:
com.wb.domain.Student —— 学生实体类
com.wb.test.StudentManager —— 主程序及所有功能方法
(测试类 com.wb.test.TestStudent 可单独验证 getIndex 方法)
StudentManager.java 完整代码:
package com.wb.test;
import com.wb.domain.Student;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManager {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Student> list = new ArrayList<>();
lo:
while (true) {
System.out.println("--------欢迎来到学生管理系统--------");
System.out.println("1 添加学生");
System.out.println("2 删除学生");
System.out.println("3 修改学生");
System.out.println("4 查看学生");
System.out.println("5 退出");
System.out.println("请输入您的选择:");
String choice = sc.next();
switch (choice) {
case "1":
addStudent(list);
break;
case "2":
deleteStudent(list);
break;
case "3":
updateStudent(list);
break;
case "4":
queryStudents(list);
break;
case "5":
System.out.println("感谢您的使用");
break lo;
default:
System.out.println("您的输入有误");
break;
}
}
}
public static void addStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
String sid;
while (true) {
System.out.println("请输入学号:");
sid = sc.next();
int index = getIndex(list, sid);
if (index == -1) {
break;
} else {
System.out.println("学号已被占用,请重新输入");
}
}
System.out.println("请输入姓名:");
String name = sc.next();
System.out.println("请输入年龄:");
int age = sc.nextInt();
System.out.println("请输入生日:");
String birthday = sc.next();
Student stu = new Student(sid, name, age, birthday);
list.add(stu);
System.out.println("添加成功!");
}
public static void queryStudents(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("无信息,请添加后重新查询");
return;
}
System.out.println("学号\t\t姓名\t年龄\t生日");
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
System.out.println(stu.getSid() + "\t" + stu.getName() +
"\t" + stu.getAge() + "\t\t" + stu.getBirthday());
}
}
public static void deleteStudent(ArrayList<Student> list) {
System.out.println("请输入您要删除的学生学号:");
Scanner sc = new Scanner(System.in);
String deleteSid = sc.next();
int index = getIndex(list, deleteSid);
if (index == -1) {
System.out.println("查无信息,请重新输入");
} else {
list.remove(index);
System.out.println("删除成功!");
}
}
public static void updateStudent(ArrayList<Student> list) {
System.out.println("请输入您要修改的学生学号:");
Scanner sc = new Scanner(System.in);
String updateSid = sc.next();
int index = getIndex(list, updateSid);
if (index == -1) {
System.out.println("查无信息,请重新输入");
} else {
System.out.println("请输入新的学生姓名:");
String name = sc.next();
System.out.println("请输入新的学生年龄:");
int age = sc.nextInt();
System.out.println("请输入新的学生生日:");
String birthday = sc.next();
Student stu = new Student(updateSid, name, age, birthday);
list.set(index, stu);
System.out.println("修改成功!");
}
}
public static int getIndex(ArrayList<Student> list, String sid) {
int index = -1;
for (int i = 0; i < list.size(); i++) {
Student stu = list.get(i);
if (stu.getSid().equals(sid)) {
index = i;
}
}
return index;
}
}
TestStudent.java 可用于单独验证 getIndex 方法:
public class TestStudent {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("heima001","张三",23,"1999-11-11"));
list.add(new Student("heima002","李四",24,"1999-12-12"));
list.add(new Student("heima003","王五",25,"1999-1-1")); // 修正原代码重复添加 stu2 的错误
int index1 = getIndex(list, "heima001");
int index2 = getIndex(list, "heima009");
System.out.println(index1); // 0
System.out.println(index2); // -1
}
// getIndex 方法同上,此处省略
}
总结
通过这个控制台版学生管理系统,我们练习了以下 Java 基础技能:
- 类与对象:定义
Student类并封装数据 - 集合框架:使用
ArrayList存储对象,调用add、remove、set、get等方法 - 流程控制:
while无限循环、带标号的break、switch分支 - 键盘输入:
Scanner的next()、nextInt()配合使用时的注意事项 - 方法抽取与复用:将查找索引的逻辑独立为
getIndex,供删除、修改和添加重复利用,遵循 DRY 原则
从零开始一步步构建一个完整的系统,能帮助初学者建立起“分析 → 设计 → 编码 → 测试”的工程思维
你也可以在此基础上继续扩展,例如:将学生信息保存到文件、增加排序和搜索功能、或改为图形界面,作为进阶练习
更多推荐

所有评论(0)