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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 21:04:54