回答:
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
-----
System.arrayCopy
clone()
配列で使用するのに適したオプションです。ブロッホは、彼はそれを配列にのみ使用し、他には何も使用しないと述べています。System.arrayCopy
結構です。Arrays.copyOf(..)
使いやすい別の方法です。
Arrays.copyOf
:-)変数を単純化するメソッドシグネチャがあり(そうすると制限されますが、ほとんどの場合に最適です)、少なくとも私のJDKでは、System.arrayCopy
とにかく使用して実装されています。そのヒントをありがとう!
array[i].clone()
参照しませんarray[i]
。これは、例のその部分が示していることです。
プリミティブの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
}
clone
プリミティブの1D配列を取得して詳細なコピーを取得できると言っていませんか?すごい!うまくやっArrays.copyOfRange()
、System.arraycopy()
!
クローンはアレイの浅いコピーです。
このテストコードは以下を出力します。
[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));
}
}