我有一个名为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。
答案 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
值指向的同一对象。