web-dev-qa-db-ja.com

配列でclone()を呼び出すと、その内容も複製されますか?

タイプAのオブジェクトの配列でclone()メソッドを呼び出すと、どのように要素を複製しますか?コピーは同じオブジェクトを参照していますか?または、それらのそれぞれに対して(element of type A).clone()を呼び出しますか?

91
Szymon

clone()は浅いコピーを作成します。つまり、要素は複製されません。 (もし彼らがCloneableを実装していなかったら?)

Arrays.copyOf(..)の代わりに配列をコピーするためにclone()を使用したい場合があります(ただし、他の場合とは異なり、配列のクローンは問題ありません)

ディープクローンを作成する場合は、 この回答を確認してください


要素がCloneableである場合でも、clone()の浅さを示す小さな例:

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  
-----  
76
Bozho

タイプAのオブジェクトの配列でclone()メソッドを呼び出すと、どのように要素を複製しますか?

配列の要素は複製されません。

コピーは同じオブジェクトを参照していますか?

はい。

または、それぞれに対して(タイプAの要素).clone()を呼び出しますか?

いいえ、どの要素でもclone()を呼び出しません。

19
Bludzee

プリミティブの1D配列は、複製時に要素をコピーします。これにより、2D配列(配列の配列)を複製するようになります。

clone()の浅いコピーの実装のため、2D配列クローンは機能しないことに注意してください。

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
}
6
Thamme Gowda

クローンは、配列の浅いコピーです。

このテストコードは次を出力します。

 [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));                                                               
    }                                                                                                                                                    
}                                                                                                                                                        
5
Simon Nickerson