小型图书馆管理系统在Java中无需框架即可运行,关键在于理清Book、Member、Library三类关系,用ArrayList封装数据并严格控制访问;Book和Member须重写equals()与hashCode();控制台交互需规范输入处理;借阅状态应使用枚举确保类型安全;借还书操作必须原子化。

小型图书馆管理系统在 Java 里不靠框架也能跑起来,关键不是堆功能,而是把 Book、Member、Library 这三个类的关系理清楚——多数人卡在“增删改查写一堆重复逻辑”,其实只要封装好核心操作,主流程十来行就能串起来。
用 ArrayList + 封装类代替数据库
学生项目或本地演示不需要 MySQL。直接用 ArrayList 存书、ArrayList 存读者,所有增删改查都围绕这两个集合展开。重点是别让 Library 类暴露内部集合,必须通过方法控制访问:
-
addBook(Book book)要检查 ISBN 是否已存在(避免重复录入) -
findBookByISBN(String isbn)返回Book对象而非int索引,避免外部越界操作 -
borrowBook(String isbn, String memberId)必须同时校验书是否存在、是否可借、读者是否存在——三者缺一不可
Book 和 Member 必须重写 equals() 和 hashCode()
否则 list.remove(book) 或 list.contains(book) 会失效,因为默认比较的是内存地址。尤其当用户输入 ISBN 查询后想借阅,你用新构造的 Book 去删原集合里的对象,不重写就删不掉。
public class Book {
private String isbn;
private String title;
// 构造、getter 省略
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
return Objects.equals(isbn, book.isbn);
}
@Override
public int hashCode() {
return Objects.hash(isbn);
}
}
控制台交互别硬写 Scanner.nextLine() 套娃
用户选 1-5 后,每一步输入都单独封装成方法,比如 inputISBN()、inputMemberId(),并在其中做基础校验(空字符串、长度超限)。常见错误是用户输错后程序直接崩,或者跳回菜单却没清掉上一次的脏输入——Scanner 缓冲区残留换行符就是罪魁祸首:
立即学习“Java免费学习笔记(深入)”;
- 每次读数字后调用
scanner.nextLine()清缓冲区 - 读字符串前先
scanner.nextLine(),别混用nextInt()和nextLine() - 菜单循环用
while (true)+break比用标志位更直观
借阅状态必须用枚举而不是字符串或数字
别用 String status = "available" 或 int status = 0 表示可借/已借。定义 enum BookStatus { AVAILABLE, BORROWED },然后在 Book 类里声明 private BookStatus status。好处很明显:
- IDE 能自动提示合法值,输错
BOROWED直接编译报错 - 后续扩展“预约中”“已归还”时,只改枚举不改逻辑分支
-
if (book.getStatus() == BookStatus.AVAILABLE)比if ("available".equals(book.getStatus()))更安全
最容易被忽略的是:借书和还书必须是原子操作——查到书、更新状态、记录借阅人,这三步不能拆开。哪怕只是控制台程序,也要在同一个方法里完成,否则演示时用户连按两次“借同一本书”,第二次会成功(因为没同步检查状态变更)。










