タイプAのオブジェクトの配列でclone()
メソッドを呼び出すと、どのように要素を複製しますか?コピーは同じオブジェクトを参照していますか?または、それらのそれぞれに対して(element of type A).clone()
を呼び出しますか?
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
-----
タイプAのオブジェクトの配列でclone()メソッドを呼び出すと、どのように要素を複製しますか?
配列の要素は複製されません。
コピーは同じオブジェクトを参照していますか?
はい。
または、それぞれに対して(タイプAの要素).clone()を呼び出しますか?
いいえ、どの要素でもclone()
を呼び出しません。
プリミティブの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
}
クローンは、配列の浅いコピーです。
このテストコードは次を出力します。
[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));
}
}