登录
首页 >  文章 >  java教程

Java实现简单仓库管理系统,对象与集合详解

时间:2026-02-25 08:28:49 162浏览 收藏

本文深入讲解了如何用Java构建一个实用且健壮的简易仓库管理系统,重点围绕ArrayList与Product对象的设计实践展开:从利用泛型和自动扩容替代固定数组,到通过唯一ID、重写equals/hashCode保障对象正确识别;从为高频查询补充HashMap索引提升性能,到封装带业务校验(空值、重复、合法性)的增删改查方法并兼顾线程安全;再到妥善处理LocalDateTime的JSON序列化难题、选用Jackson而非手写CSV或二进制实现可靠持久化;最后指出数据量增长后的自然演进路径——适时引入嵌入式数据库。全文贯穿一个核心理念:真正的系统健壮性不在于集合操作本身,而藏在每一处严谨的判断、统一的异常处理、可维护的数据格式与面向真实场景的责任边界之中。

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

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

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

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

  • 推荐用 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 备份里。

以上就是《Java实现简单仓库管理系统,对象与集合详解》的详细内容,更多关于的资料请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>