使用Java更新ArrayList/HashMap中的元素

3

我正在为大学的课程工作,涉及it技术,但我不确定如何更新HashMap中存储的对象。

我有一个抽象的'User'类,它扩展到'Customer'和'Staff'类,这些类的实例存储在名为'mapUsers'的HashMap中。

我想到的方法是将要修改的元素保存到一个temp 'User'对象中,在这个临时实例上,我可以以任何必要的方式修改对象。

我的真正问题是,这样做会更新存储在HashMap中的对象,还是我必须删除存储在HashMap中的元素,并用修改后的temp实例替换它。

有没有更简单的方法来做到这一点,我认为可能有类似于

HashMap.get(index).performOperation();

我需要类似这样的东西,可以在不移除元素的情况下执行操作。


对于用户 HashMap,它是一个 UserID,一个字符串。而对于账户 HashMap,则是一个 int 类型的账号编号。 - krex
3个回答

16

由于您的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");

5
我会尽力进行翻译:hashMap.get(1).setName("Jack") 的作用与 OP 所期望的相同。 - NullUserException
当程序启动时,我将对象添加到适当的HashMap中。但是,在我添加对象之后,除了它的键之外,我没有其他引用它的方法? - krex
1
抱歉之前表达有些混乱。我确实拥有这个键。“hashMap.get(1).setName("Jack")”就是我需要的。这解决了所有的模糊,我在网上找不到这样的例子!谢谢大家! - krex
我无法访问对象实例化的位置,例如Person p = new Person(); HashMap.put(1,p); 是在其他地方的一个方法中完成的。 - krex
啊,好的,但如果你有密钥,你可以使用第二种情况。 - Tudor
显示剩余3条评论

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;
    }
}

1

是的,但是...

如果您更改的字段会影响对象的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.

请注意,如果更改影响equals(),那么情况会变得更糟,因为map.get(“Jane Meyer”)也可能无法正常工作。 - user949300
当状态改变作用于时,它们不会真正影响hashCode()equals()。但是当它们作用于映射中的时,就会产生影响。 - Adam Zalcman
1
我感谢这些答案。我认为关于影响对象的hashCode()的这些点与我的应用程序上下文无关。如果我错了,任何帮助都将不胜感激。由于我使用账户号码(int)和用户ID(string)作为键,而且这些值都不是指向“值”内部字段的引用。在我的程序中,这些值,即用户ID和账户号码,都是不可更改的。我是否可能会遇到问题? - krex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接