Java中利用循环向list中add添加元素得到的都是最后一个

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,不进行实例化,在循环的内部进行实例化,这样实例化的对象就变成一个个地址不相同的对象,也就不会产生值覆盖的现象,或者干脆直接在循环内部进行声明和实例化,解决后的代码如下:

		for (Map<String, Object> cartMap : cartMaps) {
            Product product = new Product();
            Cart cart = new Cart();
            BeanUtils.populate(product, cartMap);
            BeanUtils.populate(cart, cartMap);
            cart.setProduct(product);
            cartList.add(cart);
        }

  这个BUG还真是第一次遇到,此前并没有在意,以上均为个人思想,严谨不足,废话有余,如果有什么说的不正确的地方还请各位大神不吝赐教,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值