Java嵌套HashMap同名字键独立存储ArrayList数据问题求解
问题根因
bug的核心原因是你定义了全局共享的单例childMap:所有parentKey在parentMap中存储的value都是这同一个childMap对象的引用。不管你给哪个parentKey塞值,实际都是往同一份子Map里写数据,最后查询时所有parent拿到的自然是全量累加后的数据,完全达不到隔离效果。
可行修复方案
直接移除全局共享的childMap变量,操作时为每个parentKey维护独立的子Map实例,从存储结构上保证不同parent下的同名childKey数据完全隔离。
修复后完整代码
import java.util.ArrayList; import java.util.HashMap; public class MapDemo { // 仅保留根Map,删除全局共享的childMap private static HashMap<String, HashMap<String, ArrayList<String>>> parentMap = new HashMap<>(); public static ArrayList<String> getMap(String parentKey, String childKey) { HashMap<String, ArrayList<String>> childMap = parentMap.get(parentKey); // 增加空判断,避免key不存在时触发空指针 if (childMap == null) { return new ArrayList<>(); } return childMap.getOrDefault(childKey, new ArrayList<>()); } public static ArrayList<String> setMap(String parentKey, String childKey, String value) { // 第一步:获取当前parentKey专属的子Map,不存在则新建空Map绑定到该parent HashMap<String, ArrayList<String>> currentChildMap = parentMap.computeIfAbsent(parentKey, k -> new HashMap<>()); // 第二步:在当前parent的专属子Map中,操作对应childKey的列表,不存在则新建空列表 currentChildMap.computeIfAbsent(childKey, k -> new ArrayList<>()).add(value); return getMap(parentKey, childKey); } public static void main(String[] args) { // 原有调用逻辑完全不需要修改 setMap("India", "EmployeeName", "A"); setMap("India", "EmployeeName", "B"); setMap("India", "EmployeeName", "C"); setMap("China", "EmployeeName", "D"); setMap("China", "EmployeeName", "E"); setMap("China", "EmployeeName", "F"); System.out.println("India: " + getMap("India", "EmployeeName")); System.out.println("China: " + getMap("China", "EmployeeName")); } }
运行结果
India: [A, B, C] China: [D, E, F]
该实现不需要给childKey加唯一前缀,不同parent下可以任意使用同名childKey,数据完全独立互不影响。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

