2016-07-28 2 views
0

지도에 목록 삽입 기능을 사용하면서 삽입 동작을 이해할 수 없습니다. 삽입하여리스트의 내용을 변경하는 방법에 대한 다음 맵에리스트의 삽입을 수행하면서삽입시지도 및 목록 값의 모호성 :

public class TestList { 

public static void main(String[] args) { 

    String strarray[] = new String[5]; 

    for(int i = 0; i < 5; i++){ 

     strarray[i] = "Demo" + i; 
    } 

    Map<Integer, List<String>> cluesByText = new HashMap<Integer, List<String>>(); 
    int j = 0; 
    for (String str : strarray) { 

     System.out.println(str); 
     List<String> s = cluesByText.get(str); 
     if (s == null) { 
      s = new LinkedList<String>(); 
      cluesByText.put(j, s); 
     } 

     s.add(str); 
     s.add(str); 
     s.add(str); 
     s.remove(1); 
     // why it is storing without doing cluesByText.put(j,s); 
     j++; 
    } 

    //output is: 

    System.out.println(cluesByText); 

} 
} 

문제/삭제 작업이를 이전 라인 맵에 저장된리스트에 반영 받고있다.

최종 출력 오는 인쇄 맵 내용은입니다.

{0=[Demo0, Demo0], 1=[Demo1, Demo1], 2=[Demo2, Demo2], 3=[Demo3, Demo3], 4=[Demo4, Demo4]} 

목록의 상태가 이미지도에 저장되어있는 이유는 무엇입니까?

+0

삽입 한 목록의 값이 여전히 원래 목록의 값을 가리키고 있습니다. –

+1

질문과 관련이 없지만 코드가 의미가 없습니다. 'cluesByText.get (str)'은 Map의 키가 String이 아닌 정수이기 때문에 항상 null을 반환합니다. – Eran

답변

0

목록에 추가 할 수 있도록 List<String>에 대한 참조가 있습니다. 지도에 항목이 없으면 List<String>이 새로 만들어지고 항목이지도에 추가됩니다. 그럼에도 불구하고 List<String>의 범위에서 작업 할 수 있습니다.

1

예상되는 동작입니다. 복사본이 아닌지도에 목록에 대한 참조가 저장됩니다. 동일한 목록은 s에 언급되어 있으므로 s을 통해 목록에 추가하면지도에서 실제로 볼 수 있습니다.이 목록은 동일한 개체에 대한 두 개의 참조입니다.

1

Java에서 (거의) 모든 것이 값이 아니라 참조임을 기억하십시오. 그래서, 당신은 정수에서리스트의 "주소"가 아닌 목록의 "상태"에 이르는지도를 가지고 있습니다.

목록에 저장된 정보를 배우려면 컴퓨터가 해당 주소로 가서 그 정보를 확인하십시오.

s을 해당 목록으로 지정하면 해당 주소를 받아 s에 저장합니다.

s.add() 또는 s.remove()을 통해 해당 목록을 변경하면 해당 주소 (지도에있는 것과 동일한 주소)로 이동하여 변경합니다.

지도를 통해 그 주소로 다시 돌아 가면 동일한 값을 보게됩니다.

실제로 주소가 s이고 주소가 = 인 경우는 실제로 주소를 다른 주소로 덮어 쓰는 것입니다. 따라서 원래 주소를 보는 경우에는 영향을받지 않습니다.