2014-10-19 6 views
0

현재 Java 프로그래머 1 인증서을 연구 중입니다. 다음 코드는 다른 ArrayList를 추가하는 방법에 관한 것입니다.ArrayList를 다른 ArrayList에 추가

ArrayList<String> myArrList = new ArrayList<String>(); 
      myArrList.add("One"); 
      myArrList.add("Two"); 
      ArrayList<String> yourArrList = new ArrayList<String>(); 
      yourArrList.add("Three"); 
      yourArrList.add("Four"); 
      myArrList.addAll(1, yourArrList); 
      for (String val : myArrList) 
      System.out.println(val); 

이것은 저자가 다음의 말씀입니다 :

당신이 목록, myArrList 및 yourArrList에서 일반적인 객체 참조를 수정하면 어떻게됩니까? 여기에는 두 가지 경우가 있습니다.

첫 번째 경우 두 목록 중 하나를 사용하여 개체 참조를 다시 할당합니다. 이 경우 두 번째 목록의 값은 변경되지 않습니다.

두 번째 경우 일반 목록 요소 중 하나의 내부를 수정합니다.이 경우 변경 내용은 목록에 모두 반영됩니다.

저자의 말은 무엇입니까 ?? 나는 그가 언급 한 2 가지 사례에 대해 약간 혼란 스럽다!

도움을 주시면 감사하겠습니다.

+0

나도 알아낼 수 없습니다. 문자열은 어쨌든 변경할 수 없으므로 내부 상태를 변경할 수 없습니다. –

+0

@JBNizet :이 부분은 확실히 ArrayLists에 관한 것이지 문자열에 대해서는 다루지 않습니다. 문자열은이 데모에서 쉬운 내용 필러로 사용됩니다. –

+1

@MartijnCourteaux : * 공통 목록 요소 *의 내부를 수정합니다. * : 목록의 요소는 문자열이며 내부 수정에 대해 이야기합니다. 저자가 무엇을 의미하는지 설명 할 수 있습니까? –

답변

1

저자가 말하는 것을 알고 있다고 생각합니다. 그러나 문자열은이를 수행하는 나쁜 예입니다. 이런 식으로 상상해보십시오. 그는 두 개의 서로 다른 클래스 인스턴스를 목록에 추가하는 것과 두 개의 목록에 동일한 인스턴스를 추가하는 것의 차이점을 설명합니다. 두 인스턴스에 동일한 인스턴스를 추가하면 해당 인스턴스를 수정하면 변경 내용이 두 목록에 반영됩니다.

import java.util.ArrayList; 

public class Example { 

    private static class Node { 
     private int value; 

     public Node(final int value) { 
      this.value = value; 
     } 

     public int getValue() { 
      return value; 
     } 

     public void setValue(final int value) { 
      this.value = value; 
     } 
    } 

    public static void main(final String... args) { 
     final ArrayList<Node> nodes1 = new ArrayList<>(); 
     final ArrayList<Node> nodes2 = new ArrayList<>(); 

     // add two different Node objects that happen to have same value 
     nodes1.add(new Node(1337)); 
     nodes2.add(new Node(1337)); 

     Node node = new Node(69); 

     // add the same node to both lists 
     nodes1.add(node); 
     nodes2.add(node); 

     node.setValue(420); 

     // do your join here and print result to see {1337, 420, 1337, 420} 
     nodes1.addAll(0, nodes2); 
     for (final Node n : nodes1) 
      System.out.println(n.getValue()); 
    } 

} 
+0

지우개가 꽉 차고, 당신 말이 맞아요. Strings는 나쁜 예입니다! –

관련 문제