2013-07-01 2 views
0

이 궁금 해요 :자바 포인터 통과지도 혼란

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

에 첫 번째 부분을 단축 할 수) 자신의 롤링 대신. –

+0

자바는 포인터를 가지고 있지 않으며, 참조를 가지며이 참조는 참조 된 객체가 아닌 복사됩니다. Java에는 암시 적 복사 생성자가 없습니다. –

답변

4

두 문장 모두 동일한 결과를 얻을 수 있습니다. 첫 번째 코드에서

nodeToLinkMap.put(node, links); 

를 호출 할 때, 당신은 실제로 자체에 값을 해당 노드 맵을 대체하고 있다는

참고.

그래서, 당신은 [구아바`Multimap`] (https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap 사용을 고려

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. 

두번째 코드는 괜찮습니다. 그러나 당신이 당신의 명부에 너무 많은 수정을하려고한다면 그것은 즐겁지 않을 것입니다.