将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
相关产品推荐
相关产品推荐

