核心是用ArrayList存书、Scanner读输入实现轻量查询;Book含title/author/isbn及getter;需处理中文编码乱码;模糊查询不区分大小写;退出用Command枚举提升容错。

用 Scanner + ArrayList 实现基础图书查询逻辑
控制台图书查询工具的核心不是界面,而是数据组织和检索响应。Java 标准库完全够用,不需要引入 Spring 或数据库——先用 ArrayList 存书,用 Scanner 读用户输入,这是最轻量、最可控的起点。
关键点在于:不要一上来就写“增删改查菜单”,先确保单次查询能跑通。比如输入书名关键词,程序遍历列表,输出所有匹配的 Book 对象(含书名、作者、ISBN)。
-
Book类至少要有title、author、isbn三个String字段,加 public getter,避免直接暴露字段 -
Scanner.nextLine()必须在读数字后补一次,否则会跳过后续字符串输入(常见卡点) - 模糊查询用
book.getTitle().toLowerCase().contains(keyword.toLowerCase()),不区分大小写更友好
public class Book {
private String title;
private String author;
private String isbn;
public Book(String title, String author, String isbn) {
this.title = title;
this.author = author;
this.isbn = isbn;
}
public String getTitle() { return title; }
public String getAuthor() { return author; }
public String getIsbn() { return isbn; }
}
避免用 HashMap 当主存储
有人图快,把书存进 HashMap,键设成书名或 ISBN——这会导致重复书名无法共存、模糊搜索失效、无法按作者批量查等硬伤。
真正合理的做法是:主存储始终用 ArrayList,只在需要快速精确查找(如按 ISBN 查唯一一本)时,额外维护一个 Map 做索引。但这个索引是可选优化,不是必需结构。
立即学习“Java免费学习笔记(深入)”;
- 主列表保持插入顺序,方便后续扩展“按添加时间排序”功能
- 如果真要用索引,键必须是唯一值(推荐
isbn),不能用title——同一书名可能有多个版本 - 每次
addBook()后,记得同步更新索引 Map,否则查不到新书
处理中文输入乱码的关键两步
Windows 控制台默认编码是 GBK,而 IntelliJ 或 Eclipse 新建 Java 文件默认 UTF-8,不统一就会出现“输入中文,Scanner 读成乱码,查询永远失败”。
- 启动 JVM 时加参数:
-Dfile.encoding=UTF-8(IDE 运行配置里设置 VM options) - 创建
Scanner时显式指定编码:new Scanner(System.in, "UTF-8") - 这两步缺一不可;只改文件编码或只改 VM 参数,都会失效
验证方法:输入“设计模式”,打印 keyword.length() —— 如果是 4,说明读对了;如果是 12 或其他数字,就是编码没对齐。
退出机制别用 while(true) + break
看似简单,但实际运行中容易让新手陷入“输错一次就整个程序崩掉”的窘境。应该把用户输入解析单独抽成方法,返回明确的指令枚举。
- 定义
enum Command { SEARCH, ADD, EXIT } - 写一个
parseCommand(String input)方法,用switch(input.trim().toLowerCase())匹配 - 遇到非法输入,打印提示但不退出,继续循环——这才是控制台工具该有的容错感
真正的难点不在语法,而在于:当用户连续输三次“查不到”,他其实想问的是“我输错格式了吗?”——所以每次查询失败,都要附带一句示例,比如“试试输入:java 编程”。










