我对带有日期格式的字符串键的Map进行了简单的观察。
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=[er]}
当我清除列表并将新密钥分配给我的地图时,我的旧值也会替换。
但我希望结果像
{2017-08-07=[as, df, vf, fg]}
{2017-08-08=[er], 2017-08-07=[as, df, vf, fg]}
如何实现这一点,任何帮助真的很感激。 谢谢
答案 0 :(得分:1)
map.put
上的来电并不意味着它会为List
创建一个全新的值。您在那里添加了对当前List a
的引用,如果您修改a
,它也会在Map
内对其进行修改。为避免这种情况,请创建一个新列表。
更改此行
map.put("2017-08-07", a);
到
map.put("2017-08-07", new ArrayList<>(a));
答案 1 :(得分:0)
那是因为您正在修改相同的列表实例,因此修改将在任何地方生效。如果您想要单独的结果,请创建一个新列表,否则在清除它时会丢失所有数据。
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);
答案 2 :(得分:0)
添加一个新列表进行映射,因此 a 不会被链接。
map.put("2017-08-07", new List<String>(a));