Java向List添加HashMap时所有元素均重复为最后一条记录
问题根因
出现该问题是两个代码逻辑错误导致的:
- 你在while循环外只创建了一个
HashMap对象myRecord,每次往ArrayList中添加的都是这个同一个对象的内存地址,不是独立的新记录。后续循环修改这个HashMap的键值对时,List中之前存入的所有条目因为指向同一个对象,内容会同步被修改,最终所有条目都会和最后一次修改的内容(也就是文件最后一行)完全一致。 - 你没有区分表头行和数据行的添加逻辑:处理第一行表头(
ext == 0分支)时,你也把空的myRecord加到了List里,导致最终List长度比实际数据行多1,出现你观察到的最后一行重复n+1次的现象。
修正代码
做最小改动的修正版本如下:
public static void main(String[] args) throws IOException { FileReader filObj = null; try { filObj = new FileReader(new File(System.getProperty("user.home") + "\\Desktop\\testData.txt")); } catch (FileNotFoundException e) { e.printStackTrace(); } BufferedReader br = new BufferedReader(filObj); List<String> headers = new ArrayList<String>(); List<HashMap<String, String>> myTable = new ArrayList<HashMap<String, String>>(); // 移除循环外统一创建的myRecord实例,避免所有记录指向同一个对象 String line = null; int ext = 0; while ((line = br.readLine()) != null) { if (ext == 0) { headers = Arrays.asList(line.split(",")); // 表头行不往myTable中添加记录 } else { // 每次处理数据行时,新建独立的HashMap实例 HashMap<String, String> myRecord = new HashMap<String, String>(); int index = 0; for (String each : line.split(",")) { myRecord.put(headers.get(index), each); index++; } // 仅将当前数据行对应的独立HashMap实例加入List myTable.add(myRecord); System.out.println("myrecord:" + myRecord); } ext++; System.out.println("My Table:" + myTable); } br.close(); }
修正后效果
代码运行后myTable中会存储3个互相独立的HashMap实例,分别对应文件中的3条业务数据,表头不会作为空记录混入结果集,不会再出现所有条目都是最后一行内容的重复问题。
内容的提问来源于stack exchange,提问作者utsav bose
相关产品推荐
相关产品推荐

