Java 将列表引用与复制放在地图上

Java 将列表引用与复制放在地图上,java,list,dictionary,arraylist,hashmap,Java,List,Dictionary,Arraylist,Hashmap,我有一张单子。我填充了他,然后把他放到地图上。然后我清除列表,再次填充他,并将他放在同一个地图上的不同键下。循环中的Ans等 Map<String, List<MyClass>> map = new HashMap<>(); List<MyClass> list = new ArrayList<>(); list.add(new MyClass(id_1)); map.put("key_1", list); list.clear();

我有一张单子。我填充了他,然后把他放到地图上。然后我清除列表,再次填充他,并将他放在同一个地图上的不同键下。循环中的Ans等

Map<String, List<MyClass>> map = new HashMap<>();
List<MyClass> list = new ArrayList<>();
list.add(new MyClass(id_1));
map.put("key_1", list);
list.clear();
list.add(new MyClass(id_2));
map.put("key_2", list);
//map is = {key_1:id_2, key_2:id_2}
//Why map is NOT = {key_1:id_1, key_2:id_2} 
Map Map=newhashmap();
列表=新的ArrayList();
添加(新的MyClass(id_1));
地图放置(“1号键”,列表);
list.clear();
添加(新的MyClass(id_2));
地图放置(“2号键”,列表);
//map is={key_1:id_2,key_2:id_2}
//为什么映射不是={key_1:id_1,key_2:id_2}

为什么地图似乎引用了列表而不是列表的新副本

您正在将列表的相同引用添加到地图中:“键1”和“键2”都指向相同的
列表
对象。您需要做的是根据第一个列表创建第二个列表:

Map<String, List<MyClass>> map = new HashMap<>();
List<MyClass> list = new ArrayList<>();
list.add(new MyClass(id_1));
map.put("key_1", list);
list.clear();
list.add(new MyClass(id_2));
map.put("key_2", new ArrayList<>(list));
Map Map=newhashmap();
列表=新的ArrayList();
添加(新的MyClass(id_1));
地图放置(“1号键”,列表);
list.clear();
添加(新的MyClass(id_2));
map.put(“key_2”,新数组列表(list));

Java就是这样工作的。你是如何放入地图的是对列表的引用。如果要复制列表,则需要显式复制

List<MyClass> copy = new ArrayList<>(list);
List copy=newarraylist(列表);
执行map.put(“key_2”,list)时,您正在放置对list对象的引用。
您必须实例化另一个列表对象。

您只有一个列表。就像你说的。