2012-11-22 3 views
6

내 랩톱의 인터넷이 작동하지 않아 여기에 코드를 입력 할 수 없다는 말로 시작하겠습니다. 좋아요. 문제는 제가 두 개의 클래스를 가지고 있다고 말합니다 : 클래스 1과 클래스 2. 클래스 1은 속성 중 하나로 ArrayList을 가지고 있으며 클래스 2에서 void 메소드를 호출하고 ArrayList을 매개 변수로 전달합니다. 이제이 메소드는 또 다른 ArrayList을 초기화하고 나에게 전달 된 매개 변수와 동일하게 만들고 그 새 값인 ArrayList을 변경합니다. 재미있는 점은 매개 변수로 전달 된 원래의 ArrayList도 변경된다는 것입니다. 가능한 이유는 무엇일까요?ArrayList를 매개 변수로 전달하기

+0

는 것 같아요. 따라서 첫 번째 참조에 대한 수정 사항은 다른 참조에 반영됩니다. 자세한 내용은 http://stackoverflow.com/a/9404727/597657을 참조하십시오. –

+0

목록이 변경 되었습니까 (제거/추가/재정렬 된 요소) 또는 목록 내의 요소 (해당 속성)가 변경 되었습니까? – Andy

답변

5

문제는 =를 사용하여 새로운 ArrayList에 원본 복사본을 만들 때 동일한 ArrayList에 대한 새로운 참조를 만드는 것입니다. 같은 대상을 가리키는 두 변수로 생각하십시오.

확인이 밖으로, 그것은 당신이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다 Is Java "pass-by-reference" or "pass-by-value"?

문제를 해결하기 위해, 당신은 "새"를 사용하여 새 ArrayList를을 만들 필요가 키워드 다음 모든 개체 추가 또는 clone() 메서드를 사용하십시오.

1

그들은 동일한 참조를 가리 키기 때문에.

3

이유는 ArrayList를 인수로 전달할 때 호출 된 메서드가 배열의 내용을 변경할 수 있기 때문입니다. ArrayList에는 Objects에 대한 참조가 들어 있습니다. 일부 클래스가 ArrayList의 내용을 변경하지 않도록하려면 에있는 ArrayList의 복사본을 제공해야합니다. 여기에있는 모든 객체는 목록에있는 객체의 clone()입니다.

사용 Object.clone()에()는

ArrayList clonedCopy = new ArrayList(list1.size()); 
for (Object obj : list1) { 
    clonedCopy.add(obj.clone()); 
} 

지금이 clonedCopy를 다시 제공합니다. 하지만 obj가 복제 가능해야합니다!

+0

올바른 점이지만, 더 간단한 코드는'ArrayList copy = new ArrayList (incomingList); ' – user949300

+3

@ user949300 NO! 귀하의 코드는 목록 안의 객체를 복사하지 않을 것이며, 그 객체에 대한 참조 만 복사합니다. 목록 안에 Date 객체가 있고 yur 복사 목록을 다른 클래스에 제공하면됩니다. 다른 클래스가 yourlist 안에있는 Date 객체를 변경할 수 있습니다! 따라서 가능한 경우 원시 타입을 사용하거나 복제하십시오 (날짜 : 더 길어짐) – AlexWien

+0

원시/무형의 사용에 관한 참이며 좋은 지적입니다. 그러나 다른 클래스가 변경을 허용 할 것인지 여부를 결정합니다. OP가 메소드 호출이 무효라고 언급 했으므로, 변경을 허용하고 싶다고 생각됩니다. 그렇지 않으면 다른 방법이 실제로 어떤 작업을 수행하는지 명확하지 않습니다. – user949300

0

Java의 = 연산자는 ArrayList 참조를 복사합니다 (모든 객체에서 동일 함). ArrayList의 전체 복사본을 만들려면 this answer을 참조하십시오.

0

새 배열 목록이 같을 때 동일한 배열을 가리키기 때문입니다.

이 작은 예에서는이를 분명히해야합니다.

import java.util.ArrayList; 
import java.util.List; 


public class JavaApplication1 { 


    public static void main(String[] args) { 

     List <String> origList = new ArrayList<>(); 
     origList.add("a"); 
     origList.add("b"); 

     JavaApplication1 app = new JavaApplication1(); 
     app.addToList(origList); 

     for(String str:origList){    
      System.out.println(str); 
     } 

    } 

    private void addToList(List<String> strList){ 
     System.out.println("inside addToList"); 
     List <String> newList = new ArrayList<>(); 
     // newList = strList; //This is how you are doing it 
     newList.addAll(strList); //This is how you should do it. 

     newList.add("x"); 
    } 
} 
1

샘플 코드 :

public class MethodArguments { 

public static void main(String args[]) { 

    ArrayList<String> a = new ArrayList<String>(); 

    a.add("Steve"); 

    a.add("Daniel"); 
    a.add("John"); 
    a.add("Maxi"); 
    a.add("Jeni"); 

    System.out.println(a); 

    display(a); 

    getSize(a); 

} 

static void display(ArrayList<String> arrayList1) { 

    arrayList1.add("Pollard"); 

    System.out.println(arrayList1); // passing the arraylist values and 
            // adding the element 

} 

static void getSize(ArrayList<String> arrayList1) { 

    System.out.println(arrayList1.size()); // getting the size of arraylist 
              // by passing arguments to 
              // method 
} 

} 

출력 :

[스티브, 다니엘, 요한, 맥시, Jeni]

[스티브, 다니엘, 요한 , Maxi, Jeni, Pollard]

당신은 힙에 동일한 개체 2 참조를 가지고 있기 때문에

6

관련 문제