在Java里如何实现简单的仓库管理系统_Java对象与集合说明

ArrayList比数组更灵活,能自动伸缩并配合泛型约束类型;Product需重写equals()和hashCode()、添加唯一id字段;高频查询应补HashMap索引;增删改操作须封装校验逻辑、考虑线程安全;JSON序列化LocalDateTime需注册JavaTimeModule;持久化推荐Jackson写JSON而非手写CSV或二进制;数据量大时应升级为嵌入式数据库。

用 ArrayList 存商品对象比用数组更灵活

数组长度固定,新增商品要扩容、删除要移动元素,实际开发中几乎不用;ArrayList 能自动伸缩,配合泛型还能约束只能存 Product 类型。关键不是“能存”,而是“怎么让每个商品有唯一标识、可查、可改”。

  • Product 类必须重写 equals()hashCode(),否则 list.remove(product) 可能删不掉——默认比较的是内存地址
  • 建议在 Product 中加一个 id 字段(如 private final String id = UUID.randomUUID().toString();),避免靠名称或价格判断是否同一商品
  • 不要用 ArrayList 做高频查询(比如按名称找商品),O(n) 太慢;真要查得快,后面补个 HashMap 按 ID 索引

增删改查操作别直接裸调集合方法

用户界面或业务逻辑层不该直接调 products.add(p)products.removeIf(...),容易漏校验、难统一处理异常。应该封装成带语义的方法:

public class Warehouse {
    private final List products = new ArrayList<>();

    public boolean addProduct(Product p) {
        if (p == null || p.getName().trim().isEmpty()) return false;
        if (products.stream().anyMatch(existing -> existing.getId().equals(p.getId()))) {
            return false; // 重复 ID 拒绝入库
        }
        return products.add(p);
    }

    public Product getProductById(String id) {
        return products.stream()
                .filter(p -> p.getId().equals(id))
                .findFirst()
                .orElse(null);
    }
}
  • addProduct() 做了空值、名称、ID 重复三重检查,返回 boolean 表示是否成功,比抛异常更符合仓储场景
  • getProductById() 返回 null 而非抛 NoSuchElementException,调用方更容易处理“没找到”的情况
  • 所有修改操作(增删改)都应考虑线程安全——单机命令行工具可忽略;Web 应用必须加同步或换 CopyOnWriteArrayList,但注意后者只适合读多写少

JSON 序列化时 LocalDateTime 会报错

如果 Product 里有 LocalDateTime createTime,用 Jackson 直接 ObjectMapper.writeValueAsString(list) 会抛 JsonMappingException:Java 8 时间类型默认不支持。

  • 最简解法:加依赖 com.fasterxml.jackson.datatype:jackson-datatype-jsr310,注册模块:
    Ob

    jectMapper mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule());
  • 不希望暴露毫秒级时间?自定义序列化器,把 LocalDateTime 格式化成 "yyyy-MM-dd HH:mm"
  • 别用 Date 回退兼容——它线程不安全、API 设计反直觉,纯属历史包袱

持久化到文件别手写 CSV 或拼字符串

FileOutputStream + ObjectOutputStream 写二进制虽然快,但换 JDK 版本或改 Product 字段就会反序列化失败;手写 CSV 容易被逗号、换行搞崩。

立即学习“Java免费学习笔记(深入)”;

  • 推荐用 Jackson 写 JSON 文件:
    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(SerializationFeature.INDENT_OUTPUT);
    mapper.writeValue(new File("warehouse.json"), products);
  • 读取时加 try-catch(JsonProcessingException | IOException e),并设好默认值(比如 JSON 缺字段时用空字符串而非 null
  • 别把整个 ArrayList 当作“数据库”——数据量超 5000 条就卡,该上 H2(嵌入式)或 SQLite 了
实际跑起来才发现,最难的不是写 add()remove(),而是想清楚“什么算合法的商品状态”“谁有权改库存”“断电后数据还在不在”。这些不在集合里,但在每一行 if 判断和每一份 JSON 备份里。