나는 현재 다음과 같은 문제, 자바 8 사용에 봉착 :ArrayList를 호출 방법에 의해 조작됩니다
내가 다른 방법에 인자로 ArrayList<String>
를 통과하고 싶은가를.
public static void calledMethod(String item, ArrayList<String> list) {
list.remove(item);
}
지금 내가 주에서이 같은이 메서드를 호출 시도 :이 방법은, 무엇보다도, 그것은 주어진 된 ArrayList를에서 개체 제거이 경우
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String item = itr.next(); //<-
calledMethod(item, list);
}
을, JVM이 반환하는 위의 코드 (//<-
)의 표시된 줄에의 java.util.ConcurrentModificationException이 있습니다. 아는 한 내 지식은 반복되는 동안 목록이 수정되었음을 의미합니다. 그러나 어떻게 이런 일이 일어날 수 있습니까? 내가 아는 한, Java는 메서드의 인수를 참조가 아니라 값으로 취급합니다. 내 주요 방법에 다음 코드를 사용하여 calledMethod
를 호출하면 오류가 발생합니다 :
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String item = itr.next(); //<-
calledMethod(item, (ArrayList<String>) list.clone());
}
그래서
calledMethod
작품에 복제 된 객체를 전달합니다. 여기서 뭐가 잘못 됐니?
java -version
: 자바 SE 런타임 환경은 내가 리눅스 민트 64 비트에서 오라클 자바를 사용하고
(1.8.0_20-B26를 구축).
당신은 "실제'ArrayList' 객체에 대한 참조 ['list'이다]"무엇을 의미합니까? 자바가 방금 쓴 것처럼 패스 - 바이 - 밸류 (value-by-value)인가? – s3lph
참조 자체가 값으로 전달됩니다. 그래서 여러 메소드의'list'는 모두 같은'ArrayList'를 참조합니다. 객체가 참조로 전달 된 것처럼 보이지만 값으로 전달되는 참조입니다. – rgettman
@the_Seppi : "참조"는 "개체에 대한 포인터"를 의미합니다. 'List','ArrayList' 등은 * 참조 형 *입니다. Java의 모든 비 기본 유형은 참조 유형입니다. 그래서'list'는 포인터입니다. 포인터를 복사하면 동일한 객체를 가리키는 다른 포인터가 생성됩니다. – newacct