Java指针传递地图混乱

时间:2013-07-01 22:22:28

标签: java pointers map

我想知道这两个陈述是否相同:

Map<String, List<String>> nodeToLinkMap = new HashMap<String, List<String>>();
... 
// (assuming the map has something in it for this key)
List<String> links = nodeToLinkMap.get(node);
links.add(link);
nodeToLinkMap.put(node, links);

Map<String, List<String>> nodeToLinkMap = new HashMap<String, List<String>>();
... 
// (assuming the map has something in it for this key)
nodeToLinkMap.get(node).add(link));

它是相同的指针还是副本?

2 个答案:

答案 0 :(得分:4)

这两个陈述都会完成同样的事情。

请注意,当您致电

nodeToLinkMap.put(node, links);

在第一个代码段中,您实际上正在替换节点映射到的值。

所以,你可以将第一部分缩短为

Map<String, List<String>> nodeToLinkMap = new HashMap<String, List<String>>();
... 
// (assuming the map has something in it for this key)
List<String> links = nodeToLinkMap.get(node);
links.add(link);

答案 1 :(得分:3)

  

它是相同的指针还是副本?

首先,Java中没有指针这样的东西。它被称为引用

List<String> links = nodeToLinkMap.get(node);

在上面的代码中,您只是创建一个对地图中存储的列表的新引用。它不会创建列表本身的副本。因此,无论您在此列表中添加或删除的内容都会反映在地图中存储的列表中。 您无需将列表放回地图中。

因此,您可以从第一个代码中删除此行:

nodeToLinkMap.put(node, links);  // Not needed.

第二个代码很好。但如果您要在列表中进行太多修改,它可能看起来不太令人愉快。