回答:
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));
}
}