2013-07-01 2 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

Рассмотрите возможность использования [гуавы '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); 

В приведенном выше коде вы просто создаете новую ссылку на список, хранящийся на карте. Он не создает копию самого списка. Итак, все, что вы добавляете или удаляете из этого списка, отражается в списке, хранящемся на карте. Вам не нужно класть список обратно на карту.

Таким образом, вы можете удалить эту строку из вашего кода 1:

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

второй код является штраф. Но это может показаться не очень приятным, если вы сделаете слишком много изменений в своем списке.

Смежные вопросы