引言
在Java开发中,集合框架是实现动态数据管理的核心工具。本文将以学生管理系统为例,深入解析如何通过Student(JavaBean类)与StudentSystem(集合管理类)的协作,构建一个基于集合框架的学生信息管理系统。通过对比传统数组管理方式,我们将揭示集合框架在代码健壮性、可扩展性和开发效率方面的优势。
一、JavaBean类设计:Student类的实现
1.1 JavaBean规范概述
JavaBean是一种符合特定规范的Java类,其核心特性包括:
- 私有字段(Private Fields)
- 公共getter/setter方法(Public Getters/Setters)
- 无参构造方法(Default Constructor)
- 可序列化(实现Serializable接口)
在学生管理系统中,Student类作为JavaBean,负责封装学生的基本信息,如ID、姓名、年龄和地址。
1.2 Student类代码实现
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String id; // 学生唯一标识
private String name; // 姓名
private int age; // 年龄
private String address; // 家庭住址
// 无参构造方法(JavaBean规范要求)
public Student() {}
// 全参构造方法(用于初始化完整数据)
public Student(String id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
// Getter和Setter方法
public String getId() { return id; }
public void setId(String id) { this.id = id; }
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 getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
}
1.3 设计特点分析
二、集合框架应用:StudentSystem类的实现
2.1 集合框架的选择与优势
在学生管理系统中,传统数组存在以下局限:
- 容量固定:需手动扩容,代码复杂度高。
- 线性查找:删除/修改操作需要遍历数组,时间复杂度O(n)。
- 内存泄漏风险:删除元素后未置null,可能导致无效引用残留。
而ArrayList<Student>作为动态数组,解决了上述问题:
- 自动扩容:内部维护一个Object数组,当容量不足时自动扩展为1.5倍。
- 高效操作:提供add(), remove(), get()等方法,简化集合操作。
- 线程安全:非线程安全设计提升性能,适用于单线程环境。
2.2 StudentSystem类核心功能实现
2.2.1 添加学生功能
public static void addStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
String id;
while (true) {
System.out.print("请输入学生ID:");
id = sc.next();
if (!isExist(list, id)) break;
System.out.println("ID已存在,请重新输入!");
}
System.out.print("请输入姓名:");
String name = sc.next();
System.out.print("请输入年龄:");
int age = sc.nextInt();
System.out.print("请输入地址:");
String address = sc.next();
Student student = new Student(id, name, age, address);
list.add(student); // 利用ArrayList的自动扩容特性
System.out.println("添加成功!");
}
2.2.2 删除学生功能
public static void deleteStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入要删除的ID:");
String id = sc.next();
int index = getIndexById(list, id);
if (index != -1) {
list.remove(index); // 直接移除元素,ArrayList自动处理后续元素前移
System.out.println("删除成功!");
} else {
System.out.println("未找到该学生!");
}
}
2.2.3 修改学生信息功能
public static void updateStudent(ArrayList<Student> list) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入要修改的ID:");
String id = sc.next();
int index = getIndexById(list, id);
if (index != -1) {
Student student = list.get(index);
System.out.print("请输入新姓名:");
student.setName(sc.next());
System.out.print("请输入新年龄:");
student.setAge(sc.nextInt());
System.out.print("请输入新地址:");
student.setAddress(sc.next());
System.out.println("修改成功!");
} else {
System.out.println("未找到该学生!");
}
}
2.2.4 查询学生信息功能
public static void queryStudent(ArrayList<Student> list) {
if (list.isEmpty()) {
System.out.println("暂无学生数据!");
return;
}
System.out.println("ID\\t姓名\\t年龄\\t地址");
for (Student student : list) {
System.out.printf("%s\\t%s\\t%d\\t%s\\n",
student.getId(),
student.getName(),
student.getAge(),
student.getAddress());
}
}
2.3 辅助方法实现
// 检查ID是否存在
public static boolean isExist(ArrayList<Student> list, String id) {
return getIndexById(list, id) != -1;
}
// 根据ID查找索引
public static int getIndexById(ArrayList<Student> list, String id) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getId().equals(id)) {
return i;
}
}
return -1;
}
三、集合框架的性能分析
容量管理 | 手动扩容,代码复杂 | 自动扩容,底层实现透明 |
添加操作 | O(n)(扩容时) | 平均O(1),最坏O(n) |
删除操作 | O(n)(需要移动元素) | O(n)(直接remove(index)) |
查询操作 | O(n)(线性查找) | O(n)(遍历集合) |
内存占用 | 固定容量,可能浪费 | 动态调整,内存利用率高 |
四、总结
通过Student(JavaBean类)与StudentSystem(集合管理类)的协作,我们构建了一个基于集合框架的学生管理系统。该系统通过以下优势实现了高效的数据管理:
对于开发者而言,理解集合框架的内部机制(如ArrayList的扩容策略、HashMap的哈希冲突处理)将有助于编写更高效的代码。在实际开发中,建议根据业务需求选择合适的集合类型,并结合异常处理、数据持久化等技术构建健壮的系统。
五、附录
Student类:
public class Student {
private String name;
private int age;
private String id;
private String address;
public Student() {
}
public Student(String name, int age, String id, String address) {
this.name = name;
this.age = age;
this.id = id;
this.address = address;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return id
*/
public String getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
* 获取
* @return address
*/
public String getAddress() {
return address;
}
/**
* 设置
* @param address
*/
public void setAddress(String address) {
this.address = address;
}
}
StudentSystem类:
import java.util.ArrayList;
import java.util.Scanner;
public class StudentSystem {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
loop:
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("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
//利用lambda表达式
switch (choose) {
case "1" -> addStudent(list);
case "2" -> deleteStudent(list);
case "3" -> updateStudent(list);
case "4" -> queryStudent(list);
case "5" -> {
System.out.println("退出");
break loop;
}
default -> System.out.println("输入有误,请重新输入");
}
/*switch (choose) {
case "1":
System.out.println("添加学生");
break;
case "2":
System.out.println("删除学生");
break;
case "3":
System.out.println("修改学生");
break;
case "4":
System.out.println("查询学生");
break;
case "5":
System.out.println("退出");
break loop;
*//*System.exit(0);*//*
default:
System.out.println("输入有误,请重新输入");
break;
}*/
}
}
//添加学生
public static void addStudent(ArrayList<Student> list) {
String id;
while (true) {
System.out.println("请输入学生id:");
id = sc.next();
if (isExist(list, id)) {
System.out.println("id已存在,请重新输入");
} else {
break;
}
}
System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
int age = sc.nextInt();
System.out.println("请输入学生家庭住址:");
String address = sc.next();
Student s = new Student(name, age, id, address);
list.add(s);
System.out.println("添加学生成功");
}
//删除学生
public static void deleteStudent(ArrayList<Student> list) {
System.out.println("请输入要删除的学生id:");
String id = sc.next();
//获取索引
int index = getIndexById(list, id);
if (index != -1) {
list.remove(index);//删除
System.out.println("删除id为:" + id + "的学生成功");
} else {
System.out.println("id不存在,删除失败");
}
}
//修改学生
public static void updateStudent(ArrayList<Student> list) {
System.out.println("请输入要修改的学生id:");
String id = sc.next();
int index = getIndexById(list, id);
if (index == -1) {
System.out.println("要修改的id" + id + "不存在,请重新输入");
return;
}
System.out.println("请输入新的姓名:");
String name = sc.next();
System.out.println("请输入新的年龄:");
int age = sc.nextInt();
System.out.println("请输入新的家庭住址:");
String address = sc.next();
list.get(index).setName(name);
list.get(index).setAge(age);
list.get(index).setAddress(address);
System.out.println("修改学生信息成功");
/*Student s = new Student(name,age,id,address);
list.set(index,s);*/
}
//查询学生
public static void queryStudent(ArrayList<Student> list) {
if (list.size() == 0) {
System.out.println("当前无学生信息,请添加后在查询");
return;//退出方法
}
//打印表头信息
System.out.println("id\\t姓名\\t年龄\\t家庭住址");
//遍历集合,获取每一个学生对象
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getId() + "\\t" + s.getName() + "\\t" + s.getAge() + "\\t" + s.getAddress());
}
}
//判断id是否重复
public static boolean isExist(ArrayList<Student> list, String id) {
/*for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
if (s.getId().equals(id)){
return true;
}
}
return false;*/
int index = getIndexById(list, id);
return index != -1;
}
//通过id获取索引
public static int getIndexById(ArrayList<Student> list, String id) {
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
if (s.getId().equals(id)) {
return i;//返回索引
}
}
return -1;//没有找到
}
}
评论前必须登录!
注册