1、发生情景
最近在写一个购物车时,需要通过增强for循环将我获得的商品product,赋值到购物cart中,然后将购物车cart放到购物车cartList中,可奇怪的是结果发现list中的每条数据均为最后一条插入的数据,Debug下我发现了,我的每条数据在插入的时候该数据插入都是正常的,但是已经插入的数据都会被替换成刚刚插入的数据,bug代码如下:
/*
* List<Map<String, Object>>:取出来的是所有的Cart 和 Product 的键值对
* 将List<Map<String, Object>>中的每一个cart和product的map键值对取出来
* 分别赋值给product和cart对应的属性中,然后将product赋值给cart的product
* */
Product product = new Product();
Cart cart = new Cart();
for (Map<String, Object> cartMap : cartMaps) {
BeanUtils.populate(product, cartMap);
BeanUtils.populate(cart, cartMap);
cart.setProduct(product);
cartList.add(cart);
}
2、原因
查阅资料发现,这是因为list在add添加元素时访问的是该对象的引用地址,list中存储的全是实例化后的对象的地址,而java中对象存储的也是地址,当同一个对象的值发生改变时,该地址的值会发生改变,这就导致了list中添加的元素都是同一个地址,当改地址存储的值发生改变,list中所有元素值都会改变,都为最后一次改变的值。
3、解决方案
既然知道了原因,那么就很容易解决了,我们可以将要存储的对象先在循环的外部先声明为null,

最低0.47元/天 解锁文章
2530

被折叠的 条评论
为什么被折叠?



