2011-04-14 5 views
6

이 방식으로 생성 된 ArrayList의 ArrayList가 있다고 가정합니다.ArrayList.clear()는 포함 된 모든 객체를 삭제합니까?

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

호출 할 경우 :

 listOfListsOfStrings.clear(); 

나중에 의 문자열에 액세스하려고 시도합니다. listOfListsOfStrings 항상이됩니다. java.lang.NullPointerException?

+1

시도해보고 결과가 어떻게 보이는지보십시오. 예상대로 작동하지 않으면 문제가있는 데모 코드를 게시하십시오. 대답은 '아니오'이므로 예외가 발생하지 않습니다. 따라서 예외가 발생하면 코딩 문제가 있으며 "what if"질문을하지 않아도됩니다. 그래서 항상 스스로 시도해야합니다. 그것은 10 줄 미만이어야합니다. – camickr

답변

3

아니요, 참조가 삭제됩니다. 오브젝트에 대한 참조가 더 이상 존재하지 않으면 가비지 콜렉션이 될 수 있지만 어쨌든 오브젝트에 대한 새로운 참조를 얻을 방법이 없으므로 NPE를 얻지 못합니다.

+0

감사합니다. 당신의 대답은 저를 미치게 만드는 버그의 근원을 찾는데 도움이되는이 놀라운 대답을 찾는데 도움이되었습니다 : http://stackoverflow.com/questions/333151/java-how-to-pass-byte-by-reference/333217 # 333217 Java에서 참조에 대한 참조를 전달할 수 없다는 것이 밝혀졌습니다. 따라서 ArrayList 매개 변수를 채울 수퍼 클래스 메서드에 전달하면 실제로 다른 배열을 채우고있었습니다. 이제는 모두 잘되었습니다. . – an00b

+0

그리고이 기사는 나 같은 미래의 n00bs를 도울 것입니다 : http://javadude.com/articles/passbyvalue.htm – an00b

+0

당신은 환영합니다 :) 사이드 노드로서, 자바는 가치에 지나지 만, 실제로 무엇이 매개 변수로 객체를 사용하면 통과됩니다. 따라서 메서드에 개체를 전달하고 수정할 수는 있지만 전달 된 참조에 개체를 할당 할 수는 없습니다. C/C++의 관점에서 객체에 대한 포인터를 값으로 전달합니다. - 버그를 줄이거 나 컴파일러를 사용하여 모든 매개 변수를 최종으로 표시 할 수 있습니다 (Eclipse에서 자동으로이 작업을 수행 할 수 있음). 그런 다음 컴파일러가 매개 변수에 다른 값을 할당하면 불평 할 것입니다. – Thomas

1

아니요, 아직 외부 참조가있는 경우 ArrayList에있는 객체는 삭제되지 않습니다. ArrayList.clear()는 고아가되지 않는 한 참조되는 객체에 아무런 영향을주지 않습니다.이 경우 나중에 참조하지 않을 것입니다.

관련 문제