JAVA解决List<Map> list.add(内容添加)重复问题

本文分析了在使用List&lt;Map&gt;结构时遇到的重复添加问题,详细解释了内存地址引用导致的数据重复现象,并提供了一种有效的解决方案。通过调整Map对象的创建时机,确保每次循环都能生成独立的对象,避免了数据重复。

JAVA解决List< Map> list.add内容添加重复问题

问题说明

List< Map>.add得到tables 中每个Map的数据全部一样;

问题代码

	List<Map<String, String>> tables=new ArrayList<Map<String,String>>();
		Map<String, String> jsonObj = new HashMap<String, String>();
 
       // 获取列数 
 
       ResultSetMetaData metaData = rs.getMetaData(); 
 
       int columnCount = metaData.getColumnCount(); 
 
       // 遍历ResultSet中的每条数据 
 
        while (rs.next()) { 
        	
            // 遍历每一列 
            for (int i = 1; i <= columnCount; i++) { 
            	
                String columnName =metaData.getColumnLabel(i); 
 
                String value = rs.getString(columnName); 
 
                jsonObj.put(columnName, value); 
 
            }   
            tables.add(jsonObj);
             jsonObj.clear();
        }

解决方案

寻觅了很久原因不果;找到了新思路如下:
调整位置并增加了Map的创建对象次数;

		//table
		List<Map<String, String>> tables=new ArrayList<Map<String,String>>();
		
 
       // 获取列数 
 
       ResultSetMetaData metaData = rs.getMetaData(); 
 
       int columnCount = metaData.getColumnCount(); 
 
       // 遍历ResultSet中的每条数据 
 
        while (rs.next()) { 
        	Map<String, String> jsonObj = new HashMap<String, String>();
            // 遍历每一列 
            for (int i = 1; i <= columnCount; i++) { 
            	
                String columnName =metaData.getColumnLabel(i); 
 
                String value = rs.getString(columnName); 
 
                jsonObj.put(columnName, value); 
 
            }   
            tables.add(jsonObj);
           
        }

总结:

个人分析原因有②:
①List< Map>中存在的Map不是Map的数值,而是Map的内存地址;所以如果ListList< Map>的Map全部指向同一个内存地址的话,值也会随之相同;
②其他原因,还没想到;

要将 Java 中 `List<Map>` 类型的 `taskList` 转换为 `List<AutoTaskDm>` 类型的 `taskDmList`,可以通过遍历 `taskList`,将每个 `Map` 中的数据提取出来,然后创建 `AutoTaskDm` 对象并添加到 `taskDmList` 中。以下是示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.Map; class AutoTaskDm { private String id; private String name; // 构造函数 public AutoTaskDm(String id, String name) { this.id = id; this.name = name; } // Getters 和 Setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "AutoTaskDm{id='" + id + "', name='" + name + "'}"; } } public class ListMapToListAutoTaskDm { public static List<AutoTaskDm> convertListMapToListAutoTaskDm(List<Map<String, Object>> taskList) { List<AutoTaskDm> taskDmList = new ArrayList<>(); for (Map<String, Object> taskMap : taskList) { String id = (String) taskMap.get("id"); String name = (String) taskMap.get("name"); AutoTaskDm taskDm = new AutoTaskDm(id, name); taskDmList.add(taskDm); } return taskDmList; } } ``` 可以使用以下方式调用上述方法: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { List<Map<String, Object>> taskList = new ArrayList<>(); Map<String, Object> taskMap1 = new HashMap<>(); taskMap1.put("id", "1"); taskMap1.put("name", "Task 1"); taskList.add(taskMap1); Map<String, Object> taskMap2 = new HashMap<>(); taskMap2.put("id", "2"); taskMap2.put("name", "Task 2"); taskList.add(taskMap2); List<AutoTaskDm> taskDmList = ListMapToListAutoTaskDm.convertListMapToListAutoTaskDm(taskList); for (AutoTaskDm taskDm : taskDmList) { System.out.println(taskDm); } } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值