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

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

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


代码示例(不要这样做)

代码如下:

List> list1 = new ArrayList>();

Map tmp1 = new HashMap();

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

for (Map 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中存储的对象的值也被修改了。

简单的画了个草图,凑合着看吧:
Java——List使用Map泛型导致List中所有数据被覆盖_第1张图片

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

List> list1 = new ArrayList>();

Map tmp1 = new HashMap();
Map tmp2 = new HashMap();

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

for (Map per : list1) {
    System.out.println(per);
}

输出结果为:

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

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

你可能感兴趣的:(Java)