2015-02-07 2 views
1

나는 내 자신의 ArrayList로 자바에서 복제에 대해 곧바로 생각하고있다. 내가 뭔가 잘못하고 또는 왜 Arrays.copyOf()를 사용 있습니까이 코드를ArrayList의 clone() 메소드, 왜 Arrays.copyOf()입니까?

@Override 
public Object clone() { 
    try { 
     MyArrayList<E> v = (MyArrayList<E>) super.clone(); 
     v.elementData = Arrays.copyOf(elementData, size); 
     return v; 
    } catch (CloneNotSupportedException e) { 
     throw new InternalError(); 
    } 
} 

를 보는 것을 들어

@Override 
public Object clone() { 
    try { 
     return (MyArrayList<E>) super.clone(); 
    } catch (CloneNotSupportedException e) { 
     throw new InternalError(); 
    } 
} 

같은 결과를 제공?

+0

'MyArrayList'와 관련하여'elementData' 란 무엇입니까? "딥 카피"를하려고하십니까? – vikingsteve

+0

"깊은"복사본과 "얕은"복사본의 차이를 이해하지 못한다고 고백해야합니다. elementData는 ArrayList의 요소 데이터입니다. 첫 번째 코드는 ArrayList 소스 코드에서 가져옵니다. Arrays.copyOf()가 두 번째 코드 예제에서 동일한 결과를 얻는 이유는 무엇입니까? 이는 두 가지 copys가 모든 데이터를 얻음을 의미합니다. –

+1

첫 번째 목록의 배열에서 일부 요소를 수정하고 두 번째 목록의 배열에있는 요소가이를 반영하는지 확인한 다음 이해하십시오. – vikingsteve

답변

3

아니요, 첫 번째 방법은 기본 배열의 복사본을 만듭니다 (주의 : 어레이에있는 객체가 아닌 어레이 사본).

후자는 원본 개체와 동일한 배열을 가리키는 ArrayList를 만듭니다.

예 : 배열의 배열은 객체, 그리고 첫번째 장소에있는 항목이기 때문에

String[][] s1 = {{new String("a"), new String("b")}}; 
    String[][] s2 = s1.clone(); 
    System.out.println(Arrays.toString(s1)); // prints [[Ljava.lang.String;@7440e464] 
    System.out.println(Arrays.toString(s2)); // prints [[Ljava.lang.String;@7440e464] 
    System.out.println(s1[0] == s2[0]); // prints true 
    System.out.println(s1 == s2); // prints false - because s2 != s1 

(s[0]가) (뿐만 아니라 객체이다) 배열 자체가 - 당신은 그 클론 볼 수 있습니다 단순히 참조를 객체에 복사했습니다.

+0

알았지 만 두 번째 코드가 있습니다. 복제 된 ArrayList에 무언가를 추가하면 복제본이 영향을받지 않습니다. –

+0

@TobiasJohansson 복제본은 프리미티브 유형 만 "복사"하지만 객체 구성원은 참조 만 복사합니다. 당신이 묘사하는 것은 이상한 것이고, 저는 이것이 당신이 보는 행동의 이유를 이해하기 위해 완전한 구현을 볼 필요가 있습니다. – alfasin

+0

그러나 기존 데이터를 수정할 때 메서드가 다른 결과를 제공합니다! 이제 알았어. 이 포인터와 참조를 사용하면 C 언어에서 훨씬 더 쉽습니다. –

관련 문제