Javaレプリケーション配列のいくつかの方法
配列レプリケーションのいくつかの一般的な使い方[1 D] System.arraycopyの用法 Arrays.copyOfの用法 Arrays.copyOfRangeの用法 浅いコピーと深いコピー[2 D配列コピーを含む]
配列int[]a={3,1,4,2,5}を定義します.int[] b=a; 配列bは、配列aに対するもう一つの参照、すなわち浅いコピーにすぎない.配列bの要素の値を変更すると、実は配列aの要素の値を変更します.
深さレプリケーションを実現するには、cloneまたはSystem.arrayCopyを次のコード1 int[]a={3,1,4,2,5}のように使用します.2 int[] b=a.clone(); 3 b[0]=10; 4 System.out.println(b[0]+""+a[0]);出力は10 3でbの値は変更されたが、aの要素の値は変更されなかった
ただしcloneとSystem.arrayCopyは、いずれも1次元配列の深さコピーです.2次元配列の場合
出力が10 10なのでcloneは2次元配列に直接作用しないJavaには2次元配列の概念がなく、配列の配列しかないため、2次元配列aに格納されているのは実際には2つの1次元配列の参照である.clone関数を呼び出すと、この2つの参照がコピーされる.証明するには、次の出力を見るだけである
5文目の出力はtrueです.
cloneで2 D配列をコピーし、各次元でclone関数を呼び出す
出力は10 3 false
int[] src = {1,3,5,7,9,11,13,15,17};
int[] dest = {2,4,6,8,10,12,14,16,18,20};
// src , 1,3,5 dest 2
System.arraycopy(src, 0, dest, 1, 3);
System.out.println(Arrays.toString(dest));
結果:[2,1,3,5,10,12,14,16,18,20] int[] src = {1,3,5,7,9,11,13,15,17};
int[] dest = {2,4,6,8,10,12,14,16,18,20};
//copyOf( src 0 )
int[] copyof=Arrays.copyOf(src, 2);
System.out.println(Arrays.toString(copyof));
の結果:[1,3] int[] src = {1,3,5,7,9,11,13,15,17};
int[] dest = {2,4,6,8,10,12,14,16,18,20};
//copyRange( src 0 , )
int[] copyofRange=Arrays.copyOfRange(src, 2,6);
System.out.println(Arrays.toString(copyofRange));
の結果:[5,7,9,11]配列int[]a={3,1,4,2,5}を定義します.int[] b=a; 配列bは、配列aに対するもう一つの参照、すなわち浅いコピーにすぎない.配列bの要素の値を変更すると、実は配列aの要素の値を変更します.
深さレプリケーションを実現するには、cloneまたはSystem.arrayCopyを次のコード1 int[]a={3,1,4,2,5}のように使用します.2 int[] b=a.clone(); 3 b[0]=10; 4 System.out.println(b[0]+""+a[0]);出力は10 3でbの値は変更されたが、aの要素の値は変更されなかった
ただしcloneとSystem.arrayCopyは、いずれも1次元配列の深さコピーです.2次元配列の場合
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
出力が10 10なのでcloneは2次元配列に直接作用しないJavaには2次元配列の概念がなく、配列の配列しかないため、2次元配列aに格納されているのは実際には2つの1次元配列の参照である.clone関数を呼び出すと、この2つの参照がコピーされる.証明するには、次の出力を見るだけである
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
System.out.println(a[0]==b[0]);
5文目の出力はtrueです.
cloneで2 D配列をコピーし、各次元でclone関数を呼び出す
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i0][0]=10;
System.out.println(b[0][0]+" "+a[0][0]);
System.out.println(b[0]==a[0]);
出力は10 3 false