Java HashMap为给定的键提供了错误的值

Java HashMap为给定的键提供了错误的值,java,hashmap,hash-collision,Java,Hashmap,Hash Collision,我正在使用类型为Map的地图。填充映射后,如果我立即使用字符串键检索一些值,则返回的列表是正确的。但经过一段时间的迭代后,这些值正在发生变化 第一次填充地图后,我没有使用map.put任何地方,只使用了map.get() 私有映射createDataMap(列出员工列表){ (雇员e:雇员名单){ Map dataMap=newhashmap(); int-level=Integer.parseInt(如getLevel()); HashMap detailsMap=dataMap.get(级别

我正在使用类型为
Map
的地图。填充映射后,如果我立即使用
字符串
键检索一些值,则返回的
列表
是正确的。但经过一段时间的迭代后,这些值正在发生变化

第一次填充地图后,我没有使用
map.put
任何地方,只使用了
map.get()

私有映射createDataMap(列出员工列表){
(雇员e:雇员名单){
Map dataMap=newhashmap();
int-level=Integer.parseInt(如getLevel());
HashMap detailsMap=dataMap.get(级别);
if(Objects.isNull(detailsMap)){
detailsMap=newhashmap();
数据映射。放置(级别、详细信息映射);
}
String deptName=key.getDepartment();
List keyList=detailsMap.get(deptName);
if(Objects.isNull(keyList)){
keyList=newarraylist();
detailsMap.put(数据映射键、键列表);
}
keyList.add(key);
}
返回数据图;
}
  • dataMap只需在循环之外实例化一次
  • 当您使用键时,它应该是e,您应该确保您发布编译的任何代码(至少!)
  • detailsMap.put(数据映射键、键列表)不正确,应该是
    detailsMap.put(e.getDepartment(),keyList)
我认为你的代码应该是这样的。它现在可以编译并正确创建地图。我冒昧地重命名了一些变量,使其更具可读性

private static Map<Integer, HashMap<String, List<Employee>>> createDataMap2(List<Employee> employeeList) {
    Map<Integer, HashMap<String, List<Employee>>> dataMap = new HashMap<>();

    for(Employee e:employeeList){

        // Get the departments for the employee's level
        int level = Integer.parseInt(e.getLevel());
        HashMap<String, List<Employee>> departmentsEmployeesMapForEmployeeLevel = dataMap.get(level);
        if (Objects.isNull(departmentsEmployeesMapForEmployeeLevel)) {
            departmentsEmployeesMapForEmployeeLevel = new HashMap<>();
            dataMap.put(level, departmentsEmployeesMapForEmployeeLevel);
        }

        // Get the employee list for the employee's department
        String deptName = e.getDepartment();
        List<Employee> employeesListForEmployeeLevelAndDepartment = departmentsEmployeesMapForEmployeeLevel.get(deptName);
        if (Objects.isNull(employeesListForEmployeeLevelAndDepartment)) {
            employeesListForEmployeeLevelAndDepartment = new ArrayList<>();
            departmentsEmployeesMapForEmployeeLevel.put(deptName, employeesListForEmployeeLevelAndDepartment);
        }

        // add the employee to its department list
        employeesListForEmployeeLevelAndDepartment.add(e);
    }

    return dataMap;
}

提供您的代码?为了简化您的代码,您可以使用类
Map
getOrDefault
,而不是在获取映射后测试映射的值是否为空。您的代码没有意义<代码>数据映射
在循环中为每个员工构造,然后返回到循环外部。这甚至不会编译。通常,请查看处理条件创建逻辑的
detailsMap=map.computeifassent(level,HashMap::New)
private static Map<Integer, HashMap<String, List<Employee>>> createDataMap2(List<Employee> employeeList) {
    Map<Integer, HashMap<String, List<Employee>>> dataMap = new HashMap<>();

    for(Employee employee: employeeList){
        int level = Integer.parseInt(employee.getLevel());
        String deptName = employee.getDepartment();

        // get the list of department employees for level
        HashMap<String, List<Employee>> departmentsEmployeesMapForEmployeeLevel = 
                dataMap.getOrDefault(level, new HashMap<>());
        // get the list of employees for level and department
        List<Employee> employeesListForEmployeeLevelAndDepartment = 
                departmentsEmployeesMapForEmployeeLevel.getOrDefault(deptName, new ArrayList<>());

        // add employee to its department for its level
        employeesListForEmployeeLevelAndDepartment.add(employee);
        // set new employee list to the employee's department
        departmentsEmployeesMapForEmployeeLevel.put(deptName, employeesListForEmployeeLevelAndDepartment);
        // set the updated department to the employee's level
        dataMap.put(level, departmentsEmployeesMapForEmployeeLevel);
    }

    return dataMap;
}