내 랩톱의 인터넷이 작동하지 않아 여기에 코드를 입력 할 수 없다는 말로 시작하겠습니다. 좋아요. 문제는 제가 두 개의 클래스를 가지고 있다고 말합니다 : 클래스 1과 클래스 2. 클래스 1은 속성 중 하나로 ArrayList
을 가지고 있으며 클래스 2에서 void 메소드를 호출하고 ArrayList
을 매개 변수로 전달합니다. 이제이 메소드는 또 다른 ArrayList
을 초기화하고 나에게 전달 된 매개 변수와 동일하게 만들고 그 새 값인 ArrayList
을 변경합니다. 재미있는 점은 매개 변수로 전달 된 원래의 ArrayList도 변경된다는 것입니다. 가능한 이유는 무엇일까요?ArrayList를 매개 변수로 전달하기
답변
문제는 =를 사용하여 새로운 ArrayList에 원본 복사본을 만들 때 동일한 ArrayList에 대한 새로운 참조를 만드는 것입니다. 같은 대상을 가리키는 두 변수로 생각하십시오.
확인이 밖으로, 그것은 당신이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다 Is Java "pass-by-reference" or "pass-by-value"?
문제를 해결하기 위해, 당신은 "새"를 사용하여 새 ArrayList를을 만들 필요가 키워드 다음 모든 개체 추가 또는 clone() 메서드를 사용하십시오.
그들은 동일한 참조를 가리 키기 때문에.
이유는 ArrayList를 인수로 전달할 때 호출 된 메서드가 배열의 내용을 변경할 수 있기 때문입니다. ArrayList에는 Objects에 대한 참조가 들어 있습니다. 일부 클래스가 ArrayList의 내용을 변경하지 않도록하려면 에있는 ArrayList의 복사본을 제공해야합니다. 여기에있는 모든 객체는 목록에있는 객체의 clone()입니다.
사용 Object.clone()에()는
ArrayList clonedCopy = new ArrayList(list1.size());
for (Object obj : list1) {
clonedCopy.add(obj.clone());
}
지금이 clonedCopy를 다시 제공합니다. 하지만 obj가 복제 가능해야합니다!
올바른 점이지만, 더 간단한 코드는'ArrayList copy = new ArrayList (incomingList); ' – user949300
@ user949300 NO! 귀하의 코드는 목록 안의 객체를 복사하지 않을 것이며, 그 객체에 대한 참조 만 복사합니다. 목록 안에 Date 객체가 있고 yur 복사 목록을 다른 클래스에 제공하면됩니다. 다른 클래스가 yourlist 안에있는 Date 객체를 변경할 수 있습니다! 따라서 가능한 경우 원시 타입을 사용하거나 복제하십시오 (날짜 : 더 길어짐) – AlexWien
원시/무형의 사용에 관한 참이며 좋은 지적입니다. 그러나 다른 클래스가 변경을 허용 할 것인지 여부를 결정합니다. OP가 메소드 호출이 무효라고 언급 했으므로, 변경을 허용하고 싶다고 생각됩니다. 그렇지 않으면 다른 방법이 실제로 어떤 작업을 수행하는지 명확하지 않습니다. – user949300
Java의 =
연산자는 ArrayList
참조를 복사합니다 (모든 객체에서 동일 함). ArrayList의 전체 복사본을 만들려면 this answer을 참조하십시오.
새 배열 목록이 같을 때 동일한 배열을 가리키기 때문입니다.
이 작은 예에서는이를 분명히해야합니다.
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");
}
}
샘플 코드 :
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
- 1. 내가 지금처럼 ArrayList를 매개 변수로 문자열 인수를 전달하기 위해 노력하고
- 2. 매개 변수로 self 전달하기
- 3. Squeak에서 매개 변수로 함수 전달하기
- 4. django : 매개 변수로 URL 전달하기
- 5. openrasta에서 매개 변수로 객체 전달하기
- 6. 함수에서 매개 변수로 객체와 ID 전달하기
- 7. ASP.Net - C# - 매개 변수로 페이지 전달하기
- 8. odbc_execute()에 매개 변수로 연산자 전달하기
- 9. C# 제네릭 타입 매개 변수로 상수 전달하기
- 10. 자바 스크립트에 매개 변수로 PHP 변수 전달하기
- 11. javascript 함수에 매개 변수로 컨트롤 전달하기
- 12. Opa : 함수 매개 변수로 데이터베이스 전달하기
- 13. xml 문서를 매개 변수로 웹 서비스에 전달하기
- 14. Java : 함수 매개 변수로 맵 전달하기
- 15. Java : 이중 연결 목록의 arraylist를 매개 변수로 전달하십시오.
- 16. 매개 변수로 정의 함수를 통과 내가 매개 변수로 함수를 전달하기 위해 노력하고
- 17. 자바 스크립트에서 다른 함수에 사용될 매개 변수로 함수 전달하기
- 18. 하나의 함수에서 여러 함수로 매개 변수로 변수 전달하기
- 19. MVC에서 변수의 따옴표를 이스케이프 처리해야합니다. JavaScript로 매개 변수로 전달하기 위해
- 20. URL을 GET 매개 변수로 전달하기 위해 인코딩하는 방법
- 21. MySQL 저장 프로 시저에서 매개 변수로 FieldName 전달하기
- 22. PHP에서 Javascript 변수로 값 전달하기
- 23. 여러 매개 변수 전달하기
- 24. PHPUnit에 매개 변수 전달하기
- 25. URL 매개 변수를 Colorbox에 전달하기
- 26. 하이퍼 링크를 통해 매개 변수 전달하기
- 27. 매개 변수를 전달하기 전에 DataContext가 변경됨
- 28. Quartz에서 작업에 매개 변수 전달하기
- 29. JavaScript로 URL 매개 변수 전달하기
- 30. 빵 부스러기에 매개 변수 전달하기
는 것 같아요. 따라서 첫 번째 참조에 대한 수정 사항은 다른 참조에 반영됩니다. 자세한 내용은 http://stackoverflow.com/a/9404727/597657을 참조하십시오. –
목록이 변경 되었습니까 (제거/추가/재정렬 된 요소) 또는 목록 내의 요소 (해당 속성)가 변경 되었습니까? – Andy