【问题标题】:Hashmap returning reference instead of copyHashmap 返回引用而不是复制
【发布时间】:2015-11-05 14:49:59
【问题描述】:

我有一个名为 Person 的模型,具有属性

name
image
age
amount

我有一个单例哈希图Hashmap<String,Person> globalPersonList,其中包含人员对象列表。

我正在尝试从我的 hashmap 中检索一个对象,例如

Person existingPerson = globalPersonList.get("key");

我想创建一个新的Person 实例并使用existingPerson 之类的属性进行初始化

Person person = new Person();
person  =  globalPersonList.get("key");

现在我想为这个人对象设置金额字段。我试过了

newPerson.setAmount(100); 

但它不应该影响globalPersonList。我只希望我的 newPerson 对象中的金额值。但现在这也设置在globalPersonList 中。如果我尝试设置金额后

globalPersonList.get("key").getAmount()

它给出了我设定的金额。是否使用对新对象的引用?我想要一个 Person 对象的单独副本,这样它就不会影响主 hashmap。

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    这是期望的行为。您的 Map's get(...) 方法将返回存储在地图中的对象,而不是该对象的副本。您应该为您的Person 使用复制构造函数。

    public Person(Person sourcePerson) {
        //copy all field values (you didn't write what are your fields so I might not be 100% accurate here)
        this.name = sourcePerson.name;
        this.image = sourcePerson.image; //I don't know what type of data is stored in image so I'll just assume it's a String url path to an image
        this.age = sourcePerson.age;
        this.amount = sourcePerson.amount;
    }
    

    然后:

    Person person = new Person(globalPersonList.get("key"));
    

    【讨论】:

    【解决方案2】:

    在一行

    Person person = new Person();
    

    您正在创建一个新的 Person 对象并将引用存储在变量 person 中。

    在下一行

    person  =  globalPersonList.get("key");
    

    您正在更改对 HashMap 中 Person 对象之一的引用。因此,您新创建的 Person 现在已经消失了,您对该对象所做的一切现在都会影响 HashMap 中的那个。

    您应该做的是用 HashMap 中的 from 对象的值初始化新的 Person 对象,然后更改一个值。

    【讨论】:

      【解决方案3】:

      您需要从HashMap 创建Person 对象的副本。这可以通过复制构造函数来完成:

      public Person(Person person){
         // Setup with the same values as the passed in Person.
      }
      

      然后您将使用此构造函数实例化一个新的Person,如下所示;

      Person newPerson = new Person(globalPersonList.get("key"));
      

      原因是当您调用globalPersonList.get("key") 时,您将获得对位于堆上的对象的引用。然后,当您编写newPerson = globalPersonList.get("key"); 时,您实际上是在说您希望newPerson 引用指向globalPersonList.get("key") 指向的同一个对象。

      因此,如果您更改 newPerson 上的值,您实际上更改的是 HashMap 值指向的同一对象。

      【讨论】:

        猜你喜欢
        • 2016-02-05
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 2011-12-16
        • 2021-11-19
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多