2010-05-06 4 views
0

저는 주로 C로 작성하지만이 프로젝트에서는 Java를 사용하고 있습니다. 후드 아래에서 Java가 무엇을하고 있는지 알고 싶습니다.Java는 ArrayList를 다시 처리하고 할당을 어떻게 처리합니까?

ArrayList<Integer> prevRow, currRow; 
currRow = new ArrayList<Integer>(); 
for(i =0; i < numRows; i++){ 
    prevRow = currRow; 
    currRow.clear(); 
    currRow.addAll(aBunchOfItems); 
} 

목록을 9 사 prevRow = currRow 라인을 아니면 prevRow 지금 currRow과 같은 목록을 가리합니까? prevRow가 currRow과 같은 목록을 가리키는 경우에, 나는 옵션 1, 옵션 2 위의 코드에서 같은 일을해야합니까, 비슷한 질문에 .... 지우고 대신

private ArrayList<Integer> someFunction(ArrayList<Integer> l){ 
    Collections.sort(l); 
    return l; 
} 

main(){ 
    ArrayList<Integer> list = new ArrayList<Integer>(Integer(3), Integer(2), Integer(1)); 

    list = someFunction(list); //Option 1 
    someFunction(list); //Option 2 
} 

을 새로운 ArrayList를를 작성해야합니까? 포인터로 "새로운"키워드로 생성 된 인스턴스의

고맙다 -

조나단

+1

질문의 기본 사항은 배열 목록과 관련이 없습니다. Java에서 참조가 처리되는 방법에 대해 읽어야합니다. – polygenelubricants

+0

http://stackoverflow.com/questions/2535410/java-immutable-object-question을 참조하십시오. – polygenelubricants

답변

8

: 자바 (프리미티브 제외) 변수는 항상 개체에 대한 참조 (포인터의 일종) 입니다 그 자체로는 결코 하나의 대상이 아닙니다. prevRow 및 currRow 이제 동일한 오브젝트를 참조하도록 예

prevRow = currRow; 

들어

은 참조를 지정한다. 객체는 복사되지 않으며, 할당이나 인수 전달에서 복사되지 않습니다 (참조는 복사/할당됩니다). 등등.

1
  1. 생각합니다. prevRow는 currRow가하는 것과 같은 것을 가리킨다. Java의 유일한 값 유형은 프리미티브 (byte, char, int, long, float, double)입니다. 다른 모든 것은 객체입니다. 프리미티브 배열은 Object 범주 ("new"로 작성)에 속합니다.
  2. 예 (반환 유형/return 문을 수정하여 컴파일 할 경우)). 당신은 C/C++ 거의 모든 의문에 답합니다이 황금 규칙을 기억에서 자바 오면
1

는 prevRow = currRow 라인 복사 목록 아니면 prevRow 지금 currRow과 같은 목록을 가리합니까? currRow 같은 목록에 prevRow 점, 나는 대신 정화 ..

을 새로운 ArrayList를을 작성해야하는 경우 지금은 동일한 목록에 대한 참조입니다. 그래서 그것을 지우면 prevList를 핵으로 만들 것입니다. INSEAD는 옵션 1과 옵션 2는 코드 위의 에서 같은 일을해야합니까, 비슷한 질문에

currRow = new ArrayList<Integer>()합니까?

예. 목록에 대한 참조를 전달하고 변경합니다. 그래서 둘 다 작동합니다. 옵션 2는 자신이하고있는 일에 대해 좀 더 명확하고 스타일을 선호하지만 둘 다 작동합니다.

Java는 항상 VALUE ..에 의해 전달되지만 기본이 아닌 (일반적으로 대문자로 시작하는 모든 클래스)에는 내부의 값이 아닌 메모리 주소의 값을 전달합니다. primative (int, float)의 경우 값을 전달하기 만하면됩니다.