2013-06-08 1 views
0

float[] a = {1,2,3};이있는 경우 딥 복사본을 얻으려면 float[] b = a; 만 사용하여 복사 할 수 있습니까? a.clone()을 사용해야 할 때 어떻게 알 수 있습니까? 플로트 배열을 복제해야합니까?

는 명확히하기 위해 : 나는 b에 영향을주지 않고 a (예를 들어 a[0]=4;)를 변경 할 수 있어야합니다.

+0

'float [] b = a;는'b'와'a'가 모두 같은'float []'에 대한 참조이고 b를 통해 이루어진 변경 사항은 물론을 통해 그리고 그 반대로도 볼 수 있음을 의미합니다. – Patashu

+0

미안하지만, 나는 깊은 사본을 얻기 위해 그렇게 할 수 있는지 물어보기로했다. – Andreas

+0

참조를 지정할 때 참조 만 복사합니다. IMHO 이것은 자바가 함수형 언어가 아니라 OO 언어이기 때문입니다. –

답변

4

그냥 만드는 float[] b = a;가 충분하지 않습니다.

그러나 기본 유형 배열을 사용 했으므로 float[] b = a.clone()을 사용하기에 충분합니다. 이 경우 복제본은 전체 복사본을 만들고 내부에 원시 값을 포함하여 배열 객체를 복제합니다.

참조 유형의 배열이있는 경우 배열을 복제하고 모든 객체를 반복 및 복제하여 전체 복사본을 얻어야합니다.

4

얕은 복사는 이전 배열의 메모리 위치를 가리 키도록 새 참조를 만드는 것을 의미하며, 딥 복사 란 새로운 메모리 위치를 할당하고 첫 번째 배열의 내용을 다른 배열에 복사하는 것을 의미합니다.

다른 사람이 첫 번째 배열을 무효화하거나 삭제하는 것을 두려워하는 경우에만 딥 복사를 사용하십시오. 이 경우 두 번째 배열은 존재하지 않는 메모리 또는 null을 가리킬 수도 있습니다. 두 번째 배열에 내용을 저장해야한다면 deep copy로 이동하고 그렇지 않으면 shallow copy를 사용하십시오.

얕은 여기에 전체 복사에 대한 자세한 내용 :

얕은 복사

float[] b = a; 

깊은 복사 : http://en.wikipedia.org/wiki/Object_copy

이것은 당신이 당신의 배열의 얕은 또는 깊은 사본을 만들 수있는 방법이다

float[] b = Arrays.copyOf(a); 
2

float[] b = a;은 변수 a에 보관 된 Array 객체의 참조를 변수 b에 할당한다는 의미입니다.

Java로 배열을 복제하려면 Arrays.copyOf() 또는 System.arraycopy()을 사용하십시오. micro-benchmarking도 확인하십시오.

+1

'copyOf'에는 너무 많은 불필요한 인수가 필요합니다. 왜 '복제'하지 않습니까? – Andreas

+1

@Andreas'clone'은 실제로 전체 배열을 복사하고자 할 때 사용하기 쉽고 세 가지 메소드 (clone, arrayCopy 및 copyOf)는 성능면에서 비슷합니다. – assylias

-1

프리미티브를 복제 할 수 있다고 생각하지 않지만 항상 새로운 배열과 루프를 만들어 모든 값을 다른 것으로 복사 할 수는 있습니다.

+1

프리미티브 배열은 프리미티브가 아니며 객체입니다. – NINCOMPOOP

0

이 같은 예를 들어 그것을 할 필요가 없음 : 나는) (a.clone를 사용해야하는 경우에

float[] b = (float[])a.clone(); 
+0

왜 캐스팅해야합니까? – Andreas

+0

@ Andreas 암시 적으로 캐스트되므로 여기에 명시 적으로 캐스트 할 필요가 없습니다. – Maroun

1

어떻게 알 수 있습니까? 없습니다

ab이 프리미티브 (즉, 부울, 문자, 바이트, INT, 긴, 플로트, 더블)하지 않은 위치를 자바로 a = b 쓰기 할 때마다

, 당신은 참조를 복사합니다. 당신의 예에서

, float[] a = {1,2,3}; 다음 float[] b = a;를 작성, 당신은 하나 개의 배열을 만들 수 있지만 그것을 "지적"두 변수가 있습니다. 배열에 대한 변경 사항은 ab에 반영됩니다.

이 배열의 깊은 사본을 얻을 당신의 목표를 달성하기 위해, 간단하게 복제 : 다음 배열 객체가 2 참조 ab 사이에 공유되기 때문에

float[] b = a.clone(); 
관련 문제