Java TreeMap Вложенный, очистить все данные, а новые нет - PullRequest
1 голос
/ 23 января 2012

Я использую вложенный TreeMap [UserMap [LibraryMap [BookMap]] *

Когда я использовал BookMap.clear () вместо new, он очищает все данные, и я остаюсь с последними 2 введенными данными в BookMap.Нужно ли создавать новый объект?Я ожидаю, что после добавления первой BookMap и внесения ясности, это не повлияет на LibraryMap, но это имело место.

TreeMap<Integer, Integer> BookMap = new TreeMap<Integer, Integer>();
    TreeMap<Integer, TreeMap<Integer, Integer>> LibraryMap = new TreeMap<Integer, TreeMap<Integer, Integer>>();
    TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>> UserMap = new TreeMap<Integer, TreeMap<Integer, TreeMap<Integer, Integer>>>();


    // Adding data to a tree map
    BookMap.put(1, 2000);
    BookMap.put(2, 2000);
    BookMap.put(3, 2003);

    LibraryMap.put(1,BookMap);
    //BookMap.clear(); 
    BookMap = new TreeMap<Integer, Integer>(); 
    BookMap.put(4, 2006);
    BookMap.put(5, 2007);

    LibraryMap.put(2,BookMap);

    BookMap= new TreeMap<Integer, Integer>();
    BookMap.put(6,2009);
    BookMap.put(7, 2012);

    LibraryMap.put(3,BookMap);

    UserMap.put(1,LibraryMap);

Ответы [ 4 ]

0 голосов
/ 23 января 2012

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

0 голосов
/ 23 января 2012

Да, вам нужно создать новый объект. Если вы очистите его, вы добавите один и тот же объект ко всем библиотекам.

Когда вы делаете это

BookMap = new TreeMap<Integer, ....;

вы создаете новый экземпляр TreeMap и указываете на него переменную с именем BookMap.

0 голосов
/ 23 января 2012

Если вы хотите связать новый BookMap с новым ключом в LibraryMap, вам нужно создать новый.

Если вы используете clear, ваша переменная BookMap по-прежнему является ссылкой на экземпляр, который вы связали с ключом 1 в LibraryMap. Другими словами:

LibraryMap.put(1,BookMap);
BookMap.clear(); //still the same instance as 1-line above
BookMap.put(4, 2006); // still the same
BookMap.put(5, 2007); // ...
LibraryMap.put(2,BookMap); // LibraryMap.get(1) and .get(2) will return the same instance

Кстати, несвязанный, но использование заглавной буквы для имени переменной неверно: условное обозначение - заглавная буква для классов и строчная буква для переменных (bookMap).

0 голосов
/ 23 января 2012

То, что вы вводите в LibraryMap, является ссылкой на BookMap, поэтому да, вам нужно будет создать new BookMap, если вы хотите, чтобы BookMap, на который ссылается LibraryMap, не изменилось.

...