Hashmap返回引用而不是副本

时间:2015-11-05 14:50:00

标签: java hashmap

我有一个名为Person with properties

的模型
name
image
age
amount

我有一个单独的散列图Hashmap<String,Person> globalPersonList,其中包含人物对象列表。

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

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

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

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

现在我想将amount字段设置为此person对象。我试过像

newPerson.setAmount(100); 

但它不应影响globalPersonList。我只想在我的newPerson对象中使用金额值。但是现在这也是globalPersonList。设定金额后,如果我尝试

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

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

3 个答案:

答案 0 :(得分:7)

这是理想的行为。您的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"));

答案 1 :(得分:0)

在第

Person person = new Person();

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

在下一行

person  =  globalPersonList.get("key");

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

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

答案 2 :(得分:0)

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

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值指向的同一对象。