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属性。
解决方案
- 给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); }
- 修改StudentGroup的setLessonsNumber方法,做防御性拷贝,避免直接引用外部的HashMap对象:
public void setLessonsNumber(HashMap<Lesson, Integer> lessonsNumber) { // 新建HashMap拷贝传入的内容,后续外部修改不会影响内部属性 this.lessonsNumber = new HashMap<>(lessonsNumber); }
- 也可以直接使用StudentGroup自带的
addLesson方法逐个添加课程,绕过直接设置整个HashMap的逻辑,降低引用传递带来的风险。
内容的提问来源于stack exchange,提问作者sinammd
相关产品推荐
相关产品推荐

