用ArrayList暂存商品实现增删改查,id必须唯一,操作前先findById校验存在性,查询分findById和findByName两类,返回统一List避免null,控制台用switch分支管理流程,修改须调用setter而非新建对象。

用 ArrayList 存商品,别急着上数据库
新手直接连 MySQL 容易卡在驱动、URL、异常处理上,先用内存集合把增删改查逻辑跑通更实际。ArrayList 足够承载百条以内商品数据,所有操作都围绕它展开。重点不是“多快”,而是“每步能 print 出来”。Product 类至少要有 id、name、price 三个字段,且 id 必须唯一——否则后续按 ID 查找会出错。
-
add(Product p):插入前先遍历检查id是否已存在,重复就跳过或抛IllegalArgumentException -
findById(int id):用 for 循环逐个比对,别依赖stream().filter(),避免初学时搞不清空指针或 Optional 处理 - 删除和修改也必须先
findById,确认对象存在再操作,否则容易NullPointerException
查询要分场景:模糊搜名字 vs 精确查 ID
用户输入 “手机” 和输入 “1001” 是两类需求,代码不能混在一起写。一个方法只做一件事:findByName(String keyword) 做子串匹配(用 name.contains(keyword)),findById(int id) 做数值相等判断。别把两个逻辑塞进同一个方法里加 if 分支——后期加价格区间查询、分类筛选时会越来越难维护。
-
name.contains(keyword)区分大小写,如需忽略,改用name.toLowerCase().contains(keyword.toLowerCase()) - 返回结果统一用
List,即使只查到一个也返回单元素列表,调用方不用反复判 null 或类型转换 - 查不到时返回空
new ArrayList(),而不是null,避免调用方漏判空指针
控制台交互别写死 while(true),用 switch + break 控制流程
很多教程用无限循环加 break 跳出,实际一不小心就陷入死循环。更稳妥的是把菜单选项转成整数,用 switch 分支明确每个操作的入口和出口:
System.out.println("1. 添加商品");
System.out.println("2. 按ID查询");
System.out.println("3. 按名称搜索");
System.out.print("请选择:");
int choice = scanner.nextInt();
switch (choice) {
case 1: addProduct(); break;
case 2: showById(); break;
case 3: showByName(); break;
default: System.out.println("无效选项"); break;
}
这样每选一次就执行一个动作,不自动回到开头,方便调试单个功能;想循环只需在外层包一层 while,且可随时加退出条件(比如输入 0 就 break)。
立即学习“Java免费学习笔记(深入)”;
修改商品时,别 new 新对象覆盖原引用
常见错误是:查出对象后,Product p = findById(1001); p.setName("新手机"); —— 这没问题;但有人会写成 p = new Product(1001, "新手机", 2999);,这就断开了和原 ArrayList 中对象的引用关系,原列表里的数据根本没变。
- 修改必须通过 setter 改已有实例的字段,而不是重新赋值变量
- 如果要用新对象替换,得先用
list.indexOf(oldP)找下标,再用list.set(index, newP) - 更安全的做法是:修改操作统一走
updateById(int id, String name, double price)方法,在内部完成查找 + 字段赋值
真正容易被忽略的,是商品 ID 的连续性假设——没人规定 ID 必须从 1 开始递增,所以所有基于“第几个元素”的操作(比如 get(0))都是错的,必须严格依赖 id 字段做查找。










