배열에서 clone ()을 호출해도 내용이 복제됩니까?
clone()A 유형의 객체 배열에서 메서드를 호출하면 해당 요소를 어떻게 복제합니까? 사본이 동일한 객체를 참조합니까? 아니면 (element of type A).clone()그들 각각을 부를 까요?
clone()얕은 복사본을 만듭니다. 즉, 요소가 복제되지 않습니다. (구현하지 않았다면 Cloneable어떨까요?)
Arrays.copyOf(..)대신에 어레이 복사 에 사용할 수 있습니다 clone()(복제는 다른 것과 달리 어레이에 대해 괜찮습니다)
깊은 복제를 원하면 이 답변을 확인하십시오.
clone()요소가 Cloneable다음 과 같은 경우에도 얕음을 설명하는 간단한 예 :
ArrayList[] array = new ArrayList[] {new ArrayList(), new ArrayList()};
ArrayList[] clone = array.clone();
for (int i = 0; i < clone.length; i ++) {
System.out.println(System.identityHashCode(array[i]));
System.out.println(System.identityHashCode(clone[i]));
System.out.println(System.identityHashCode(array[i].clone()));
System.out.println("-----");
}
인쇄물:
4384790
4384790
9634993
-----
1641745
1641745
11077203
-----
유형 A의 객체 배열에서 clone () 메서드를 호출하면 해당 요소를 어떻게 복제합니까?
배열의 요소는 복제되지 않습니다.
사본이 동일한 객체를 참조합니까?
예.
아니면 각각에 대해 (유형 A의 요소) .clone ()을 호출할까요?
아니요, clone()요소를 호출하지 않습니다 .
기본 요소의 1D 배열은 복제 될 때 요소를 복사합니다. 이것은 우리가 2D 배열 (Array of Arrays)을 복제하도록 유혹합니다.
의 얕은 복사 구현으로 인해 2D 배열 복제가 작동하지 않습니다 clone().
public static void main(String[] args) {
int row1[] = {0,1,2,3};
int row2[] = row1.clone();
row2[0] = 10;
System.out.println(row1[0] == row2[0]); // prints false
int table1[][]={{0,1,2,3},{11,12,13,14}};
int table2[][] = table1.clone();
table2[0][0] = 100;
System.out.println(table1[0][0] == table2[0][0]); //prints true
}
클론은 어레이의 얕은 복사본입니다.
이 테스트 코드는 다음을 인쇄합니다.
[1, 2] / [1, 2] [100, 200] / [100, 2]
MutableInteger이 두 배열에서 objects[0]및 으로 공유 되기 때문에 objects2[0]참조 objects[1]를 objects2[1].
import java.util.Arrays;
public class CloneTest {
static class MutableInteger {
int value;
MutableInteger(int value) {
this.value = value;
}
@Override
public String toString() {
return Integer.toString(value);
}
}
public static void main(String[] args) {
MutableInteger[] objects = new MutableInteger[] {
new MutableInteger(1), new MutableInteger(2) };
MutableInteger[] objects2 = objects.clone();
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
objects[0].value = 100;
objects[1] = new MutableInteger(200);
System.out.println(Arrays.toString(objects) + " / " +
Arrays.toString(objects2));
}
}
참고 URL : https://stackoverflow.com/questions/5821851/does-calling-clone-on-an-array-also-clone-its-contents
'IT박스' 카테고리의 다른 글
| dplyr 요약 : 출력에서 길이가 0 인 그룹을 유지하려면 ".drop = FALSE"와 동일합니다. (0) | 2020.09.04 |
|---|---|
| 프로덕션 환경에서 스프링 부트 실행 가능 jar를 어떻게 실행합니까? (0) | 2020.09.04 |
| Meteor에는 어떤 보안 메커니즘이 있습니까? (0) | 2020.09.04 |
| std :: ssize ()가 C ++ 20에 도입 된 이유는 무엇입니까? (0) | 2020.09.04 |
| MySQL 조건부 삽입 (0) | 2020.09.03 |