Javaの配列におけるclone()
についての分かりやすい説明を見つけたので訳してみました。
[引用]stackoverflow
Clone method for Java arrays
cloneメソッドが配列に呼び出される時、同じ配列要素の新しいインスタンスを返却します。
例えば、次のコードではint[]a
とint[]b
では違うインスタンスを生成します。
int[] a = {1,2,3};
int[] b = a.clone();
* 「a == b ?」 は、aとbが同じインスタンスか?という判定
System.out.println(a == b ? "同じインスタンスです":"違うインスタンスです");
//出力: 違うインスタンスです
2つは異なるインスタンスなので、int[]bに対する変更は、int[]aには影響しないということになります。
b[0] = 5;
System.out.println(a[0]);
System.out.println(b[0]);
//出力 : 1
// : 5
これがオブジェクトの配列操作となると少しややこしい話になります。(配列の場合)クローンメソッドにより新しい配列の参照先を返却します。これはコピー元の配列オブジェクトと同じ参照先になります。
例えばDogクラス
があったとします。
class Dog{
private String name;
public Dog(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
そして私はDogクラス
の配列を追加します。
Dog[] myDogs = new Dog[4];
myDogs[0] = new Dog("Wolf");
myDogs[1] = new Dog("Pepper");
myDogs[2] = new Dog("Bullet");
myDogs[3] = new Dog("Sadie");
そしてdog
をクローンすると・・・
Dog[] myDogsClone = myDogs.clone();
2つは同じ要素を参照します。
System.out.println(myDogs[0] == myDogsClone[0] ? "同じ":"違う");
System.out.println(myDogs[1] == myDogsClone[1] ? "同じ":"違う");
System.out.println(myDogs[2] == myDogsClone[2] ? "同じ":"違う");
System.out.println(myDogs[3] == myDogsClone[3] ? "同じ":"違う");
//出力: 同じ (4回)
これはどうゆうことかというと、2つは同じ参照先なのでクローンした配列に対して変更を加えた場合、その変更がもともとの配列にも反映されるということです。
// myDogsCloneに変更を加えると、myDogsの要素の値にも反映される。
myDogsClone[0].setName("Ruff");
System.out.println(myDogs[0].getName());
//出力: Ruff
しかし、配列に対して新しくインスタンスを作成するとその変更は元のインスタンスに影響しません。
myDogsClone[1] = new Dog("Spot");
System.out.println(myDogsClone[1].getName());
System.out.println(myDogs[1].getName());
//出力: Spot
// Pepper
とても勉強になりました!