Java TreeMap嵌套,清除擦除所有数据而不是新数据

时间:2012-01-23 15:31:54

标签: java nested treemap

我正在使用嵌套的TreeMap [UserMap [LibraryMap [BookMap]]

当我使用BookMap.clear()而不是new时,它会清除所有数据并保留在BookMap中的最后2个输入数据。我需要创建新对象吗?我希望在添加第一个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 :(得分:0)

您向LibraryMap提出的内容是对BookMap的引用,如果您希望引用new BookMap,则需要创建BookMap LibraryMap不要改变。

答案 1 :(得分:0)

是的,您需要创建一个新对象。如果清除它,您将向所有LibraryMaps添加相同的对象。

当你这样做时

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

您正在创建一个新的TreeMap实例并将名为BookMap的变量指向它。

答案 2 :(得分:0)

如果要将新BookMap与LibraryMap中的新键关联,则需要创建一个新的KeyMap。

如果使用clear,则变量BookMap仍然是对与LibraryMap中的键1关联的实例的引用。换句话说:

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)。

答案 3 :(得分:0)

那是因为Map(或者一般来说,Java)存储了你所放置的对象的引用/指针。进去。因此,当您操纵该对象时,容纳它的容器也会受到影响。