我正在使用嵌套的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);
答案 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)存储了你所放置的对象的引用/指针。进去。因此,当您操纵该对象时,容纳它的容器也会受到影响。