0

これら2つのステートメントが同等かどうか疑問に思っています:

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

同じポインターですか、それともコピーが作成されますか?

4

2 に答える 2

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);
于 2013-07-01T22:27:11.377 に答える
3

同じポインターですか、それともコピーが作成されますか?

まず第一に、Java にはポインターのようなものはありません。それは参照と呼ばれます。

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

上記のコードでは、マップに格納されているリストへの新しい参照を作成しているだけです。リスト自体のコピーは作成されません。したがって、このリストに追加または削除したものはすべて、マップに保存されているリストに反映されます。リストをマップに戻す必要はありません。

したがって、最初のコードからこの行を削除できます。

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

2番目のコードは問題ありません。しかし、リストを変更しすぎると、見栄えがよくないかもしれません。

于 2013-07-01T22:24:09.400 に答える