Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HashMap值替换旧值,即使对于java中的新键_Java_Collections - Fatal编程技术网

HashMap值替换旧值,即使对于java中的新键

HashMap值替换旧值,即使对于java中的新键,java,collections,Java,Collections,我有一个简单的观察,地图上有日期格式的字符串键 List<String> a =new ArrayList(); a.add("as"); a.add("df"); a.add("vf"); a.add("fg"); HashMap<String,List> map = new HashMap<>(); map.put("2017-08-07", a); System.out.println(""+map); a.clear(); a.add("er"); m

我有一个简单的观察,地图上有日期格式的字符串键

List<String> a =new ArrayList();
a.add("as");
a.add("df");
a.add("vf");
a.add("fg");
HashMap<String,List> map = new HashMap<>();
map.put("2017-08-07", a);
System.out.println(""+map);
a.clear();
a.add("er");
map.put("2017-08-08", a);
System.out.println(""+map);
当我清除列表并为我的地图分配新键时,我的旧值也将被替换

但我希望结果是这样的

{2017-08-07=[as, df, vf, fg]}
{2017-08-08=[er], 2017-08-07=[as, df, vf, fg]}
如何做到这一点,任何帮助真的感谢。
谢谢

这是因为您正在修改列表的同一个实例,因此修改将影响所有地方。如果您希望有单独的结果,请创建一个新列表,否则在清除列表时会丢失所有数据

map.put("2017-08-07", a);
System.out.println(""+map);
List<String> b = new ArrayList<>();
b.add("er");
map.put("2017-08-08", b);
System.out.println(""+map);
map.put(“2017-08-07”,a);
System.out.println(“+map”);
列表b=新的ArrayList();
b、 添加(“er”);
地图放置(“2017-08-08”,b);
System.out.println(“+map”);
将一个新列表放到地图上,这样就不会链接到

map.put("2017-08-07", new List<String>(a));
map.put(“2017-08-07”,新列表(a));

调用
map.put
并不意味着它将为
列表创建一个全新的值。您将当前
列表a
的引用放在那里,如果您修改
a
,它也会在
映射中修改它。要避免这种情况,请创建一个新列表

换行

map.put("2017-08-07", a);

map.put(“2017-08-07”,新ArrayList(a));

您只有一个
列表
。地图中的两个条目都指向相同的
列表
。当您将列表放入地图时,不会复制列表。嗨,deadpool,当您使用“map.put”(“2017-08-07”,a);”时,您在“地图”中存储了一个“a”的memroy引用对象。当您使用“a.clear();”和“a.add(“er”);”时,它会清除存储在内存中该位置的数据并存储新数据。由于“map.put”(“2017-08-07”,a);“使用相同的旧内存位置,其值现在已更新。:-)谢谢你的帮助。我知道了。@deadpool是的,你可以按照Murat的建议使用这个列表。只要确保在很长一段时间后您没有使用“map”hashmap。休息吧,一切都会好的。还可以尝试使用“map”作为局部变量,因为它可能会根据“map”中的条目数影响性能(在使用线程时可以看到)这是存储新值的方法,但请确保在很长时间后不使用HashMap,因为它有一个缺点。如果您正在使用多个“新”对象,并且长时间没有引用相同的对象(考虑到“map”是一个全局变量),GC有时会删除随机对象,从而导致“null”值。观察了很多次,但不知道GC为什么这样做@穆拉克。也许你能告诉我。@Aman这超出了这个问题的范围。如果你真的对此感兴趣,你可以提出一个新问题。不@MuratK。没有超出范围。因为我面临这个问题,并且花了很多时间调试它,所以我只想分享信息。:-)@阿曼:如果我为地图中的每个键使用新列表,你能分享更多关于这个的信息吗。
map.put("2017-08-07", a);
map.put("2017-08-07", new ArrayList<>(a));