Как можно предотвратить изменение списка, используемого в качестве значения карты? - PullRequest
0 голосов
/ 19 апреля 2020
Map<String, list> map = new HashMap();
List list = new ArrayList();

list.add("1");
list.add("2");
list.add("3");

map.put("first", list);
list.clear();

System.out.println(map.get("first"));  // = null

Я хочу использовать его для различных карт, используя список в части значений карты.

Его нельзя использовать, поскольку он постоянно изменяется. Помощь!

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Добавьте new ArrayList<>, созданный из списка, вместо добавления ссылки на карту. Когда вы добавляете ссылку, любое изменение в объекте через ссылку будет отражаться везде, на который ссылался этот объект (по этой ссылке).

Сделайте это следующим образом:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        List<String> list = new ArrayList<String>();

        list.add("1");
        list.add("2");
        list.add("3");

        map.put("first", new ArrayList<String>(list));
        list.clear();

        System.out.println(map.get("first"));
    }
}

Вывод:

[1, 2, 3]

В примечании не используйте необработанный тип , например, вы должны использовать List<String> list = new ArrayList<String>(); вместо List list = new ArrayList();.

0 голосов
/ 19 апреля 2020

Когда вы передаете ссылку в Java, это делается путем копирования ссылки. Таким образом, вы получите две ссылки на один и тот же экземпляр списка. Первый из них - list, второй - тот, который вы поместили на карту. Изменения через одну из этих ссылок изменят один и тот же экземпляр. Если вы хотите отдельные экземпляры, вы должны скопировать свой список. Это можно сделать с помощью метода Collections.copy () или, как уже указывал Арвинд Кумар Авина sh, с помощью конструктора копирования.

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