Метод HashMap.put () в HashMap, созданном из списка (содержащего объекты HashMap), изменяет исходный список объектов. - PullRequest
0 голосов
/ 24 января 2019

В моем коде у меня есть ArrayList contentChecklist , в котором хранятся объекты HashMap.После добавления всех объектов HashMap в список, и если я получу последний объект HashMap из списка и сохраню его в новом объекте HashMap ( CheckListMaptemp ) и используйте CheckListMaptemp.put("place", "somePlace");.Он изменяет оригинальный объект HashMap, присутствующий в списке.

public static void main(String[] args) {    
    List<HashMap> contentChecklist = new ArrayList<>();

    Map<String,String> checklIstMap1= new HashMap<>();
    checklIstMap1.put("name", "name1");
    checklIstMap1.put("uuid", "001");

    contentChecklist.add(checklIstMap1);

    Map<String,String>  checklIstMap2= new HashMap<>();
    checklIstMap2.put("name", "name2");
    checklIstMap2.put("uuid", "002");

    contentChecklist.add(checklIstMap2);

    Map<String,String> CheckListMaptemp= (Map<String, String>) contentChecklist.get(contentChecklist.size()-1);

    CheckListMaptemp.put("place", "somePlace");

    for (Iterator iterator = contentChecklist.iterator(); iterator.hasNext();) {
        Map object = (Map) iterator.next(); 
        String val = (String) object.get("place");
        System.out.println(val);
    }
}

Вывод:

null

somePlace

Я знаю, что это правильное поведение, но ястремится узнать, как изменяется содержимое contentChecklist , когда мы вызываем CheckListMaptemp.put("place", "somePlace"); для CheckListMaptemp , даже если оба они разные объекты.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Так работает коллекция. Всякий раз, когда вы добавляете какой-либо объект в коллекцию, ваша коллекция просто указывает на один и тот же объект. Он не создаст новый объект.

В вашем случае вы создали два HashMap объекта checklIstMap1 и checklIstMap2. Когда вы добавили его в ArrayList, т.е. contentChecklist, ваш ArrayList просто будет содержать ссылку на обе карты. Он не создаст новую карту и не добавит ее в список.

Итак, когда вы делаете Map<String,String> CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);. Он просто возвращает ссылку на объект карты, он не создает новый объект и возвращает.

Так что, если вы сделаете какую-либо модификацию, она будет отражена в том же объекте.

0 голосов
/ 24 января 2019
Map CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);

Переменная CheckListMaptemp является ссылкой на объект Map, содержащийся в списке в позиции contentChecklist.size()-1.Таким образом, любые изменения, которые вы сделаете, используя эту ссылку, будут отражены в этом Map объекте.Ссылка НЕ ​​указывает на другой Map объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...