float[] a = {1,2,3};
이있는 경우 딥 복사본을 얻으려면 float[] b = a;
만 사용하여 복사 할 수 있습니까? a.clone()
을 사용해야 할 때 어떻게 알 수 있습니까? 플로트 배열을 복제해야합니까?
b
에 영향을주지 않고
a
(예를 들어
a[0]=4;
)를 변경 할 수 있어야합니다.
float[] a = {1,2,3};
이있는 경우 딥 복사본을 얻으려면 float[] b = a;
만 사용하여 복사 할 수 있습니까? a.clone()
을 사용해야 할 때 어떻게 알 수 있습니까? 플로트 배열을 복제해야합니까?
b
에 영향을주지 않고
a
(예를 들어
a[0]=4;
)를 변경 할 수 있어야합니다.
그냥 만드는 float[] b = a;
가 충분하지 않습니다.
그러나 기본 유형 배열을 사용 했으므로 float[] b = a.clone()
을 사용하기에 충분합니다. 이 경우 복제본은 전체 복사본을 만들고 내부에 원시 값을 포함하여 배열 객체를 복제합니다.
참조 유형의 배열이있는 경우 배열을 복제하고 모든 객체를 반복 및 복제하여 전체 복사본을 얻어야합니다.
얕은 복사는 이전 배열의 메모리 위치를 가리 키도록 새 참조를 만드는 것을 의미하며, 딥 복사 란 새로운 메모리 위치를 할당하고 첫 번째 배열의 내용을 다른 배열에 복사하는 것을 의미합니다.
다른 사람이 첫 번째 배열을 무효화하거나 삭제하는 것을 두려워하는 경우에만 딥 복사를 사용하십시오. 이 경우 두 번째 배열은 존재하지 않는 메모리 또는 null을 가리킬 수도 있습니다. 두 번째 배열에 내용을 저장해야한다면 deep copy로 이동하고 그렇지 않으면 shallow copy를 사용하십시오.
얕은 여기에 전체 복사에 대한 자세한 내용 :
얕은 복사
float[] b = a;
깊은 복사 : http://en.wikipedia.org/wiki/Object_copy
이것은 당신이 당신의 배열의 얕은 또는 깊은 사본을 만들 수있는 방법이다
float[] b = Arrays.copyOf(a);
float[] b = a;
은 변수 a
에 보관 된 Array 객체의 참조를 변수 b
에 할당한다는 의미입니다.
Java로 배열을 복제하려면 Arrays.copyOf() 또는 System.arraycopy()을 사용하십시오. micro-benchmarking도 확인하십시오.
프리미티브를 복제 할 수 있다고 생각하지 않지만 항상 새로운 배열과 루프를 만들어 모든 값을 다른 것으로 복사 할 수는 있습니다.
프리미티브 배열은 프리미티브가 아니며 객체입니다. – NINCOMPOOP
어떻게 알 수 있습니까? 없습니다
a
및 b
이 프리미티브 (즉, 부울, 문자, 바이트, INT, 긴, 플로트, 더블)하지 않은 위치를 자바로 a = b
쓰기 할 때마다
, float[] a = {1,2,3};
다음 float[] b = a;
를 작성, 당신은 하나 개의 배열을 만들 수 있지만 그것을 "지적"두 변수가 있습니다. 배열에 대한 변경 사항은 a
과 b
에 반영됩니다.
a
및
b
사이에 공유되기 때문에
float[] b = a.clone();
'float [] b = a;는'b'와'a'가 모두 같은'float []'에 대한 참조이고 b를 통해 이루어진 변경 사항은 물론을 통해 그리고 그 반대로도 볼 수 있음을 의미합니다. – Patashu
미안하지만, 나는 깊은 사본을 얻기 위해 그렇게 할 수 있는지 물어보기로했다. – Andreas
참조를 지정할 때 참조 만 복사합니다. IMHO 이것은 자바가 함수형 언어가 아니라 OO 언어이기 때문입니다. –