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

Java Web项目中StudentGroup存入ArrayList后内部HashMap为空问题排查

问题解决:StudentGroup对象加入ArrayList后lessonsNumber为空

首先可以确定ArrayList的add()方法本身没有问题,该问题属于Java对象引用传递或HashMap键规则使用不规范导致的,排查思路和解决方案如下:

排查思路

  • 检查自定义Lesson类是否正确重写了equals()和hashCode()方法
    HashMap以自定义对象作为键时,必须同时重写这两个方法才能保证存、取逻辑一致,否则会出现明明已经put了值,读取时却找不到对应键的情况,直观表现就是HashMap看起来是空的。
  • 检查HashMap的引用传递问题
    确认你是否在循环外定义了临时HashMapt,或是在studentGroupList.add(tempstd)之后调用了t.clear()之类的修改操作。由于StudentGroup.setLessonsNumber()直接把外部HashMap的引用赋值给了内部属性,如果所有StudentGroup共享同一个HashMap对象,后续对这个对象的修改会同步到所有已添加的StudentGroup实例上。
  • 验证添加后即时状态
    在studentGroupList.add(tempstd)代码行之后,立刻打印刚添加到列表里的对象内容:
    out.println("<br>列表内元素:"+ studentGroupList.get(i).toString() +"<br>");
    
    确认是添加后立刻为空,还是后续业务代码修改了列表内元素的属性。
  • 检查是否有额外逻辑重置属性
    确认项目中是否有切面、拦截器、工具类等逻辑会自动清空StudentGroup的lessonsNumber属性。

解决方案

  1. 给Lesson类补充equals和hashCode的重写逻辑,示例如下(基于name字段判断相等,可根据实际业务调整):
import java.util.Objects;

// Lesson类中添加以下方法
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Lesson lesson = (Lesson) o;
    return Objects.equals(name, lesson.name);
}

@Override
public int hashCode() {
    return Objects.hash(name);
}
  1. 修改StudentGroup的setLessonsNumber方法,做防御性拷贝,避免直接引用外部的HashMap对象:
public void setLessonsNumber(HashMap<Lesson, Integer> lessonsNumber) {
    // 新建HashMap拷贝传入的内容,后续外部修改不会影响内部属性
    this.lessonsNumber = new HashMap<>(lessonsNumber);
}
  1. 也可以直接使用StudentGroup自带的addLesson方法逐个添加课程,绕过直接设置整个HashMap的逻辑,降低引用传递带来的风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:39:04