2013-07-01 106 views
0

我想知道,如果这两个语句是等价的:Java的指针传递地图混乱

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

它是相同的指针或不复制得到做?

+3

考虑使用[A番石榴'Multimap'(https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap )而不是滚动你自己的。 –

+0

Java没有指针,它具有引用,并且这些引用被复制,而不是它们引用的对象。 Java中没有隐式拷贝构造函数。 –

回答

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); 
3

这是相同的指针还是做了副本?

首先,在Java中没有指针这样的东西。它被称为参考

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

在上面的代码中,您只是简单地创建一个新的引用到存储在地图中的列表。它不创建列表本身的副本。所以,无论你从这个列表中添加或删除,都会反映在地图中存储的列表中。 您不需要将列表放回地图中。

所以,你可以从你的第一个代码删除此行:

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

第二代码是好的。但是如果你要在你的列表中做太多的修改,它可能看起来并不愉快。