我正在为uni做一些课程,我真的应该知道这一点,但我不确定如何更新存储在HashMap中的对象。
我有一个抽象的'User'类,它扩展为'Customer'和'Staff'类,其实例存储在名为'mapUsers'的HashMap中。
我认为可以完成的方法是将要修改的元素保存到 temp 'User'对象中,在这个临时实例上我可以以任何必要的方式修改Object。
我真正的问题是,这会更新存储在HashMap中的对象,还是我必须删除存储在HashMap中的元素,并用修改后的 temp 实例替换。
有没有更简单的方法来做到这一点,我想也许像
HashMap.get(index).performOperation();
类似的东西,我可以在不删除元素的情况下执行操作。
答案 0 :(得分:11)
由于您的HashMap
拥有引用,请执行以下操作:
Person p = new Person();
p.setName("John");
hashMap.put(1, p);
p.setName("Jack");
也会在HashMap
内更改名称,因为两个引用都指向相同的内容。
或者,假设p
中已有HashMap
:
Person p = hashMap.get(1);
p.setName("Jack");
答案 1 :(得分:2)
在这种情况下我会做的是 - 尝试一下。简而言之,您获得的是引用而不是值,因此对引用所做的更改将反映在集合中。
import java.util.*;
public class Test {
public static void main(String args[]) {
Test test = new Test();
test.letsSee();
}
public void letsSee() {
List<Thing> things = new ArrayList<Thing>();
things.add(new Thing(1));
Thing thing = things.get(0);
thing.i = 10;
for (Thing t : things) {
System.out.println(t.i);
}
}
}
class Thing
{
public int i;
public Thing(int i) {
this.i = i;
}
}
答案 2 :(得分:0)
是的,但是......
如果您更改的字段影响对象的hashCode(),则会发生错误。因为如果您稍后搜索该对象,它将不在正确的bin中,您将无法找到它。
例如,Jane结婚了,但你也使用她的名字作为哈希键。
map.get("Jane Meyer").setName("Jane Meyer-Jones"); // "legal"
map.get("Jane Meyer") returns the new married version of "Jane Meyer-Jones".
but
map.get("Jane Meyer-Jones") returns null.