即使对于java

时间:2017-08-09 10:56:03

标签: java collections

我对带有日期格式的字符串键的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]}

如何实现这一点,任何帮助真的很感激。 谢谢

3 个答案:

答案 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));