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

将JSON数组值存入List后放入HashMap时旧值被覆盖的问题求助

问题分析与解决

问题根源

你遇到的问题核心是Java对象引用的特性:

  • 代码里只初始化了一次List<String> roles = new LinkedList<>();,之后每次循环仅调用roles.clear()清空元素,并没有创建新的List对象。
  • HashMap存储的是List对象的引用地址,而非List的副本。所以Map中所有key对应的都是同一个LinkedList实例——每次对roles执行clear、add操作时,所有关联这个引用的Map条目都会同步变化,导致之前存入的值被覆盖。

修复方案

推荐两种可行的修复方式,优先选择第一种更高效的写法:

方式1:每次循环创建新的List实例

把List的初始化放到for循环内部,每次迭代生成新的List对象,确保每个key对应独立的List:

public Map<String,List<String>> getUserDetails(String json) throws IOException
{
    Map<String,List<String>> KV = new HashMap<>();

    List<String> arrayKeys = jsonUtil.getJsonArrayKey(json);
    System.out.println("Array Key      :  " + arrayKeys);
    for (String key : arrayKeys)
    {
        // 每次循环创建新的LinkedList实例
        List<String> roles = new LinkedList<>();
        JSONObject jsonObject = new JSONObject(json);
        JSONArray explrObject = jsonObject.getJSONArray(key);
        for (int i = 0; i < explrObject.length(); i++)
        {
            String value = (explrObject.get(i).toString());
            System.out.println("Array Value : " + value);
            roles.add(value);
        }
         KV.put(key, roles);
        System.out.println("Key and Value     :"+KV);
    }
    return KV; // 原代码返回的profileOrg_KV是未定义变量,此处修正为KV
}

方式2:存入List的副本(备选)

如果一定要复用外部List对象,可以在put到Map时存入当前List的副本,让Map中每个条目持有独立的List:

// 循环内修改put的代码
KV.put(key, new LinkedList<>(roles));

额外注意

原代码最后返回的profileOrg_KV是未定义变量,会导致编译报错,需修正为返回创建的KV对象。

内容的提问来源于stack exchange,提问作者Santa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:25:15