Манипулировать ArrayList, сохраненным как значение в HashMap

У меня есть HashMap, в котором Id хранится как ключ, а ArrayList — как значение. Для определенного ключа я хочу получить соответствующий ArrayList и манипулировать одним из элементов типа IEntity внутри этого ArrayList.

Мой вопрос: когда я обновляю свойство элемента, будет ли это отражено в ArrayList внутри HashMap? Или мне придется удалить список, заменить этот элемент в списке и снова вставить список для этого ключа, чтобы увидеть отраженное значение в HashMap. Я знаю, что Java передается по значению, но немного сложно понять этот сценарий.

Ниже приведен код, который у меня есть. Спасибо

ArrayList<IEntity> list = myMap.get(id);
Iterator<IEntity> itr = list.iterator();

        while(itr.hasNext()){               
            IEntity element = itr.next();
            if(element.checkSomeProperty() == false){
                element.setThatProperty(true);
// will above statement reflect the change in ArrayList stored in HashMap as well?
            }
        }

person Mandar    schedule 12.02.2014    source источник


Ответы (3)


Элемент также будет обновлен внутри HashMap. Это потому, что он содержит ссылку на ArrayList, который, в свою очередь, содержит элемент. Даже когда элемент каким-то образом изменен, карта по-прежнему указывает на тот же список, который все еще содержит и указывает на тот же (теперь измененный) элемент.

person Martin Dinov    schedule 12.02.2014

Java использует ссылочные переменные для всех переменных, включая переменные экземпляра, используемые внутри файла Map. Таким образом, вам не нужно повторно вставлять его (кроме случаев, когда ваша карта клонирует объекты, а обычные классы из Collection фреймворка — нет).

person dst    schedule 12.02.2014

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

person Judge Mental    schedule 12.02.2014