Обновить элемент в ArrayList / HashMap, используя Java - PullRequest
2 голосов
/ 19 ноября 2011

Я делаю некоторую курсовую работу для универа, я действительно должен знать это, но я не уверен, как я могу обновить объект, сохраненный в HashMap.

У меня есть абстрактный класс 'User', который распространяется на классы 'Customer' и 'Staff', экземпляры которых хранятся в HashMap с именем 'mapUsers'.

Я думал, что это можно сделать, сохранив элемент, который будет изменен, в temp 'User' объект, в этом временном экземпляре я мог изменить объект любым необходимым способом.

Мой реальный вопрос заключается в том, обновит ли это объект, хранящийся в HashMap, или мне придется удалить элемент, сохраненный в HashMap, и заменить его на измененный temp экземпляр.

Есть ли более простой способ сделать это, я подумал, может быть, что-то вроде

HashMap.get(index).performOperation();

что-то в этом роде, где я могу выполнить операцию без удаления элементов.

Ответы [ 3 ]

11 голосов
/ 19 ноября 2011

Так как ваш 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");
2 голосов
/ 19 ноября 2011

Что я сделаю в этом случае - попробуй.Короче говоря, вы получили ссылку, а не значение, поэтому изменения, внесенные в ссылку, будут отражены в коллекции.

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;
    }
}
0 голосов
/ 19 ноября 2011

Да, но ...

Если поле, которое вы изменяете, влияет на hashCode () объекта, произойдут плохие вещи. Потому что, если вы будете искать этот объект позже, он не будет в нужной корзине, и вы не найдете его.

Например, Джейн выходит замуж, но вы также используете ее имя в качестве хэш-ключа.

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...