2012-11-09 2 views
2

I이 [준 자바 코드] 할 경우에 globalPublicStaticArrayList루프의 ArrayList.add() 이후에 모든 요소가 동일합니다. 왜?

while (loop) 
{ 
    localObject = getDataForObject(); 
    globalPublicStaticArrayList<Object>.add(localObject); 
} 

모든 요소들이 동일한 추가의 LocalObject 마지막 사본을 동일. 나는 디버거에서 루프를 밟아서 Object가 추가 되 자마자 globalPublicStaticArrayList의 모든 요소에 복사되는 것을 보았습니다.

내가 찾은 해결 방법은 다음과 같습니다

while (loop) 
{ 
    localObject = getDataForObject(); 
    globalPublicStaticArrayList<Object>.add(new Object(localObject.member1, localObject.member2,...)); 
} 

이 통과 참조에 의한 자바에서 함께 할 수있는 그 무언가를 했습니까? 첫 번째 경우에는 요소가 어떻게 동일하게됩니까? 감사.

+0

은'getDataForObject()'에 대한 코드를 보여줍니다. 또는 아마도 전체 활동 코드 – waqaslam

+0

이 질문은 다른 질문 이전에 질문되었습니다. 이게 중복 된 것이지 그게 아닌가? 당신의 통찰력에 감사드립니다. – iceman

답변

4

Java는 값별로 호출을 사용하지만 여기서 값은 이며 객체에 대한 참조는입니다.

목록에 추가 할 내용은 개체의 복사본이 아니라 참조 사본입니다. 메서드는 호출 할 때마다 동일한 객체를 반환했습니다. 매번 새로운 객체를 반환해야하므로이 해결 방법이 필요하지 않습니다.

+0

. getDataForObject()를 참조하는 경우 해당 질문의 자리 표시 자일뿐입니다. 디버거/로그에서 localObject가 각 반복마다 다른 데이터를 보유하고 있음을 알 수 있습니다. 유일한 차이점은 add() 호출입니다. 이것은 java.util.ArrayList.add(); – iceman

+0

@iceman :'디버거/로그에서 localObject가 각 반복마다 다른 데이터를 보유하고 있음을 알 수 있습니다. '라는 메시지가 표시됩니다. 다른 데이터를 포함 할 수 있지만 여전히 동일한 객체입니다. 유추 : 집에는 매일 다른 가구가있을 수 있지만 여전히 같은 집입니다. 가구를 바꾸어도 다른 집이되는 것은 아닙니다. –

+0

확인. 나는 당신을 얻는다. 내 질문은 이제, 각 패스 후 또는 각 add() 호출 후, globalPublicStaticArrayList의 모든 요소가 동일하게됩니까? 그것은 다음과 같습니다 : 1 번 : localObject = 1 globalPublicStaticArrayList = [1]; 2를 전달하십시오 : localObject = 2 globalPublicStaticArrayList = [2, 2]; 3을 전달하십시오 : localObject = 3 globalPublicStaticArrayList = [3, 3, 3]; 4를 넘기십시오 : localObject = someValue globalPublicStaticArrayList = [someValue, someValue, someValue, someValue]; 전달 N : localObject = finalValue globalPublicStaticArrayList = [finalValue * N times]; – iceman

2
globalPublicStaticArrayList<Object>.add(localObject); 

여기서는 localObject 참조를 전달합니다. 당신은 매 반복마다 새로운 객체를 만들어야하는 모든 객체의 복사본을 원합니다.

0

getDataForObject()에서 반환 유형의 "새"객체를 생성하지 않았을 수 있습니다. 때문에 모든 개체가 동일한 주소를 가리키고 있습니다.

관련 문제