Java——List使用Map泛型导致List中所有数据被覆盖

Java——List使用Map泛型导致List中所有数据被覆盖

最近在做项目时遇到一个小问题——遍历List向数据库插入数据时发现插入的多条数据完全一样,后来debug调试了一下发现是因为引用传递的问题,记录一下以便以后翻阅。


代码示例(不要这样做)

代码如下:

List<Map<String, String>> list1 = new ArrayList<Map<String, String>>();

Map<String, String> tmp1 = new HashMap<String, String>();

//第一条记录
tmp1.put("name", "张三");
tmp1.put("sex", "男");
list1.add(tmp1);
//第二条记录
tmp1.put("name", "李四");
tmp1.put("sex", "女");
list1.add(tmp1);

for (Map<String, String> per : list1) {
    System.out.println(per);
}

Map的存储方式为:如果传入的key已存在,则覆盖value。所以这段代码可能会有人认为输出结果为:

{sex=男, name=张三}
{sex=女, name=李四}

但是实际的输出为:

{sex=女, name=李四}
{sex=女, name=李四}

因为在Java中,向List存Map时实际存储的是tmp1这个引用的值——对应Map对象的内存地址,而在这段代码中构造第二条记录时复用了tmp1对象,此时tmp1引用指向的对象和List中的引用指向的对象是相同的,所以当覆盖掉第一条记录的值时,List中存储的对象的值也被修改了。

简单的画了个草图,凑合着看吧:
这里写图片描述

解决代码示例(可以这样做)

List<Map<String, String>> list1 = new ArrayList<Map<String, String>>();

Map<String, String> tmp1 = new HashMap<String, String>();
Map<String, String> tmp2 = new HashMap<String, String>();

//第一条记录
tmp1.put("name", "张三");
tmp1.put("sex", "男");
list1.add(tmp1);
//第二条记录
tmp2.put("name", "李四");
tmp2.put("sex", "女");
list1.add(tmp2);

for (Map<String, String> per : list1) {
    System.out.println(per);
}

输出结果为:

{sex=男, name=张三}
{sex=女, name=李四}

因为是引用传递的问题,所以解决方法也特别简单,new一个新的Map对象存储数据即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值