You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:18:30