[java] 배열에서 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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        


답변