HashMap存储Doctor对象时新对象覆盖旧对象问题求助
HashMap存储Doctor对象时全部被覆盖的问题解决
问题描述
使用HashMap<String, Doctor>存储Doctor对象(key对应Doctor的code属性),调用addDoctor方法添加新Doctor时,所有已存在的旧对象都会被新对象覆盖。打印所有已添加的Doctor时,发现所有旧对象与新对象完全相同。
原因分析
问题的核心出在DoctorInputer类中:
- 该类在构造方法中仅创建一个Doctor实例,并将其作为成员变量保存。
- 每次调用
getDoctorDetails()时,都是在修改这个同一个实例的属性,然后返回它的引用。 - HashMap中存储的是对象的引用,因此所有key对应的都是同一个Doctor对象的引用。当第二次修改这个实例的属性时,所有指向它的引用都会同步看到最新的属性值,表现为旧对象被"覆盖"。
解决方案
每次调用getDoctorDetails()时,创建一个新的Doctor实例,而非复用同一个实例。这样每次返回的都是独立的对象,HashMap中存储的是不同的对象引用,修改新对象不会影响已存储的旧对象。
修改后的代码示例
修正后的DoctorInputer类
public class DoctorInputer { public DoctorInputer() { // 无需提前初始化Doctor实例 } public Doctor getDoctorDetails() { // 每次调用方法时新建一个Doctor实例 Doctor doctor = new Doctor(); doctor.setCode(Validation.getString("Enter code: ", "Code should follow format 'DOC_number'", "^DOC\\d+$")); doctor.setName(Validation.getString("Enter name: ", "Invalid", "[a-zA-Z]+")); doctor.setSpecialization(Validation.getString("Enter specialization: ", "Invalid", "[a-zA-Z]+")); doctor.setAvaiability(Validation.getInt("Enter avaiability: ", "Avaiability >= 0", "Invalid", 0, Integer.MAX_VALUE)); return doctor; } }
说明
修改后,每次调用addWorker()都会获取到全新的Doctor对象,HashMap中每个key对应不同的对象实例。后续添加新Doctor时,只会修改新实例的属性,不会影响已存入HashMap的旧对象,即可正常保存多个不同的Doctor数据。
内容的提问来源于stack exchange,提问作者Duong Nguyen
相关产品推荐
相关产品推荐

