选用ArrayList而非普通数组,因其支持动态扩容及add()、remove()等便捷方法;商品类需定义id、name、price、quantity并实现Serializable;购物车用ArrayList泛型声明,增删改查需按ID操作、合并数量、避免强转与并发问题。

为什么不用普通数组而选 ArrayList
因为购物车商品数量不固定,添加、删除频繁,数组长度不可变且缺乏便捷操作方法。ArrayList 内部基于动态数组,支持按需扩容,还自带 add()、remove()、get() 等方法,省去手动管理索引和边界判断的麻烦。
注意:ArrayList 允许重复元素、不保证线程安全,普通单用户购物车场景完全够用;若涉及并发修改(如后台异步清空+前端同时加购),得额外加锁或换用 Collections.synchronizedList()。
怎么定义商品类并让购物车存它
购物车本质是「存商品对象的容器」,不能只存字符串或数字。先写一个简洁的 Product 类:
public class Product {
private String id;
private String name;
private double price;
private int quantity; // 购买数量
<pre class="brush:php;toolbar:false;">public Product(String id, String name, double price) {
this(id, name, price, 1);
}
public Product(String id, String name, double price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
// getter 方法略(实际使用中必须有)}
立即学习“Java免费学习笔记(深入)”;
然后声明购物车:
ArrayList<product> cart = new ArrayList();</product>
别漏掉泛型 <product></product> —— 否则取出来要强转,容易 ClassCastException,也失去编译期类型检查。
增删改查常用操作怎么写才不出错
真实购物车不是简单堆商品,得处理「同一商品多次加入应合并数量」「删除时按 ID 找而非下标」「查总价要遍历累加」等逻辑:
- 添加商品(合并同 ID):
先用stream().filter().findFirst()查是否已存在;存在则调setQuantity(old + new),否则add(new Product(...)) - 按 ID 删除:
用removeIf(p -> p.getId().equals(targetId)),比遍历 +remove(i)更安全(避免ConcurrentModificationException或漏删) - 修改某商品数量:
找到后直接调product.setQuantity(newQty),不要新建对象再替换 ——ArrayList存的是引用,改属性即可 - 计算总价:
cart.stream().mapToDouble(p -> p.getPrice() * p.getQuantity()).sum(),注意价格和数量都可能是int/double混用,别丢精度
序列化购物车到文件或传参时要注意什么
如果要把 cart 写入文件、存入 Session、或通过 JSON API 返回,必须确保 Product 实现 Serializable 接口(否则 NotSerializableException):
public class Product implements Serializable { ... }
同时建议显式加 private static final long serialVersionUID = 1L;,否则类结构稍变(比如加个字段)就无法反序列化旧数据。
另外,JSON 序列化(如用 Jackson)默认不认 private 字段,要么加 @JsonProperty,要么确保有 public getter —— 这点常被忽略,导致返回空 JSON 对象。










