Java コピー配列
Java コピー配列
このチュートリアルでは、例を使用して、Java で配列 (1 次元と 2 次元の両方) をコピーするために使用できるさまざまな方法について学習します。
Java では、ある配列を別の配列にコピーできます。 Java で配列をコピーするために使用できる手法がいくつかあります。
1.代入演算子を使用した配列のコピー
例を挙げましょう
class Main {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers; // copying arrays
for (int number: positiveNumbers) {
System.out.print(number + ", ");
}
}
}
出力 :
1, 2, 3, 4, 5, 6
上記の例では、代入演算子 (=
) を使用しています。 ) numbers という名前の配列をコピーするには positiveNumbers という名前の別の配列に .
この手法は最も簡単な手法であり、同様に機能します。ただし、この手法には問題があります。 1 つの配列の要素を変更すると、他の配列の対応する要素も変更されます。たとえば、
class Main {
public static void main(String[] args) {
int [] numbers = {1, 2, 3, 4, 5, 6};
int [] positiveNumbers = numbers; // copying arrays
// change value of first array
numbers[0] = -1;
// printing the second array
for (int number: positiveNumbers) {
System.out.print(number + ", ");
}
}
}
出力 :
-1, 2, 3, 4, 5, 6
ここで、numbers の 1 つの値を変更したことがわかります。 配列。 positiveNumbers を出力するとき 配列、同じ値も変更されていることがわかります。
これは、両方の配列が同じ配列オブジェクトを参照しているためです。これは、浅いコピーが原因です。シャロー コピーの詳細については、シャロー コピーにアクセスしてください。
ここで、配列をコピーしながら新しい配列オブジェクトを作成するには、浅いコピーではなく深いコピーが必要です。
2.ループ コンストラクトを使用して配列をコピーする
例を見てみましょう:
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int [] source = {1, 2, 3, 4, 5, 6};
int [] destination = new int[6];
// iterate and copy elements from source to destination
for (int i = 0; i < source.length; ++i) {
destination[i] = source[i];
}
// converting array to string
System.out.println(Arrays.toString(destination));
}
}
出力 :
[1, 2, 3, 4, 5, 6]
上記の例では、for
を使用しています。 ループして、ソース配列の各要素を反復処理します。各反復で、ソース から要素をコピーしています 目的地への配列
ここでは、コピー元とコピー先の配列が異なるオブジェクト (ディープ コピー) を参照しています。したがって、ある配列の要素が変更された場合、別の配列の対応する要素は変更されません。
声明に注目してください、
System.out.println(Arrays.toString(destination));
ここでは、 toString() メソッドを使用して配列を文字列に変換しています。詳細については、toString() メソッド (公式の Java ドキュメント) を参照してください。
3. arraycopy() メソッドを使用した配列のコピー
Java では、System クラスに arraycopy()
という名前のメソッドが含まれています。 配列をコピーします。この方法は、上記の 2 つよりも配列をコピーするための優れた方法です。
arraycopy()
メソッドを使用すると、コピー元配列の指定した部分をコピー先配列にコピーできます。たとえば、
arraycopy(Object src, int srcPos,Object dest, int destPos, int length)
ここで、
- src - コピーしたいソース配列
- srcPos - ソース配列の開始位置 (インデックス)
- 宛先 - ソースから要素がコピーされる宛先配列
- destPos - 宛先配列の開始位置 (インデックス)
- 長さ - コピーする要素の数
例を見てみましょう:
// To use Arrays.toString() method
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] n1 = {2, 3, 12, 4, 12, -2};
int[] n3 = new int[5];
// Creating n2 array of having length of n1 array
int[] n2 = new int[n1.length];
// copying entire n1 array to n2
System.arraycopy(n1, 0, n2, 0, n1.length);
System.out.println("n2 = " + Arrays.toString(n2));
// copying elements from index 2 on n1 array
// copying element to index 1 of n3 array
// 2 elements will be copied
System.arraycopy(n1, 2, n3, 1, 2);
System.out.println("n3 = " + Arrays.toString(n3));
}
}
出力 :
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
上記の例では、arraycopy()
を使用しています。 メソッド、
System.arraycopy(n1, 0, n2, 0, n1.length)
- n1 の要素全体 配列は n2 にコピーされます 配列System.arraycopy(n1, 2, n3, 1, 2)
- 2 n1 の要素 インデックス 2 から始まる配列 1 から始まるインデックスにコピーされます n3の 配列
ご覧のとおり、int の要素のデフォルトの初期値は 型配列は 0 です。
4. copyOfRange() メソッドを使用した配列のコピー
Java Arrays クラスで定義されている copyOfRange() メソッドを使用して、配列をコピーすることもできます。たとえば、
// To use toString() and copyOfRange() method
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] source = {2, 3, 12, 4, 12, -2};
// copying entire source array to destination
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
System.out.println("destination1 = " + Arrays.toString(destination1));
// copying from index 2 to 5 (5 is not included)
int[] destination2 = Arrays.copyOfRange(source, 2, 5);
System.out.println("destination2 = " + Arrays.toString(destination2));
}
}
出力
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
上記の例では、
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
ここで、destination1 を作成していることがわかります 配列と source のコピー 同時に配列します。 destination1 を作成していません copyOfRange()
を呼び出す前の配列 方法。メソッドの詳細については、Java copyOfRange を参照してください。
5.ループを使用した 2 次元配列のコピー
1 次元配列と同様に、for
を使用して 2 次元配列をコピーすることもできます。 ループ。たとえば、
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < destination.length; ++i) {
// allocating space for each row of destination array
destination[i] = new int[source[i].length];
for (int j = 0; j < destination[i].length; ++j) {
destination[i][j] = source[i][j];
}
}
// displaying destination array
System.out.println(Arrays.deepToString(destination));
}
}
出力 :
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
上記のプログラムで、次の行に注目してください。
System.out.println(Arrays.deepToString(destination);
ここでは、deepToString()
メソッドを使用して、2 次元配列をより適切に表現します。詳細については、Java deepToString() にアクセスしてください。
arraycopy() を使用した 2 次元配列のコピー
上記のコードをより単純にするために、内側のループを System.arraycopy()
に置き換えることができます 1 次元配列の場合と同様です。たとえば、
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < source.length; ++i) {
// allocating space for each row of destination array
destination[i] = new int[source[i].length];
System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
}
// displaying destination array
System.out.println(Arrays.deepToString(destination));
}
}
出力 :
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
ここで、内側の for
を置き換えることで同じ出力が得られることがわかります arraycopy()
でループ メソッド。
Java