Javaで配列をコピーする方法
以下に説明する方法は、1次元アレイにのみ適用可能である。 Javaで配列をコピーするさまざまな方法について説明する前に、配列をコピーしない方法を説明します。
Javaで配列をコピーする方法
Javaの配列はオブジェクトです。あなたがそれらを変数として扱おうとすれば…まあまあですが、あなたが実際にコピーしているのは参照です!以下の例では、このステートメントについて説明します。
HowNottoCopyAnArray.java
package com.techfou.copyarray; import java.util.Arrays; public class HowNOTtoCopyAnArray { public static void main(String[]args){ int[]x = {1, 2, 3, 4, 5}; int[]y = x;//don't copy array like this! System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"\n"); x[1]= 22;//y[1]will display 22! same reference System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"\n"); y[4]= 55;//x[4]will display 55! System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)); } }
出力:
….[1, 2, 3, 4, 5][1, 2, 3, 4, 5][1, 22, 3, 4, 5][1, 22, 3, 4, 5][1, 22, 3, 4, 55][1, 22, 3, 4, 55]….
1. Object.clone()
Arrays`は
Object`クラスのメソッドを継承し、 `clone`もそれらの一つです。配列をコピーする必要がある場合は、これを使用する必要があります。
CloneArray.java
package com.techfou.copyarray; import java.util.Arrays; public class CloneArray { public static void main(String[]args){ int[]x = {1, 2, 3, 4, 5}; int[]y = x.clone(); System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"\n"); x[1]= 22; System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)+"\n"); y[4]= 55; System.out.println(Arrays.toString(x)); System.out.println(Arrays.toString(y)); } }
出力:
….[1, 2, 3, 4, 5][1, 2, 3, 4, 5][1, 22, 3, 4, 5][1, 2, 3, 4, 5][1, 22, 3, 4, 5][1, 2, 3, 4, 55]….
2.Arrays.copyOf()
`Arrays`クラスには、配列を完全にまたは部分的にコピーする2つのメソッドがあります。以下は `copyOf()`メソッドの例です。
ArraysCopyOfMethod.java
package com.mkyong.copyarray; import java.util.Arrays; public class ArraysCopyOfMethod { public static void main(String[]args){ String[]x = {"one", "two", "three", "four", "five"}; String[]y = Arrays.copyOf(x, x.length); String[]z = Arrays.copyOf(x, 3);//will copy the 3 first elements of array x System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y)); System.out.println("Array z: " + Arrays.toString(z)); } }
出力:
Array x:[one, two, three, four, five]Array y:[one, two, three, four, five]Array z:[one, two, three].... === 3.Arrays.copyOfRange() これはcopyOfRange()メソッドの例です。 ArraysCopyOfRangeMethod.java
package com.mkyong.copyarray;
import java.util.Arrays;
public class ArraysCopyOfRangeMethod {
public static void main(String[]args){ String[]x = {"one", "two", "three", "four", "five"}; String[]y = Arrays.copyOfRange(x, 0, x.length);//full copy of the array String[]z = Arrays.copyOfRange(x, x.length-2, x.length);//copy only the last 2 elements
System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y)); System.out.println("Array z: " + Arrays.toString(z)); } }
出力:
Array x:[one, two, three, four, five]Array y:[one, two, three, four, five]Array z:[four, five]….
4. System.arraycopy()
`System.arraycopy()`を使うと、コピーしたいソース配列と目的地から要素の範囲を制御することができます。
`System.arraycopy`シグネチャを確認します(https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang.Object -int-int-[JavaDoc]):
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
SystemArrayCopy.java
package com.mkyong.copyarray; import java.util.Arrays; public class SystemArrayCopy { public static void main(String[]args){ String[]x = {"one", "two", "three", "four", "five"}; String[]y = new String[2]; System.arraycopy(x, 3, y, 0, 2); System.out.println("Array x: " + Arrays.toString(x)); System.out.println("Array y: " + Arrays.toString(y) + "\n"); Object[]z = new Object[5]; System.arraycopy(x, 0, z, 0, 5); System.out.println("Array z: " + Arrays.toString(z)+"\n"); Integer[]w = {3, 4, 5}; System.out.println("Array w: " + Arrays.toString(w)); //copy from the second value (1) of array w to z and place in the fourth place (3) the 2 values System.arraycopy(w, 1, z, 3, 2); System.out.println("Array z: " + Arrays.toString(z)); } }
出力:
Array x:[one, two, three, four, five]Array y:[four, five] Array z:[one, two, three, four, five] Array w:[3, 4, 5]Array z:[one, two, three, 4, 5].... ** 注意** 投げられた例外を処理するためにcatchを使ってコードを囲むことを忘れないでください === 参考文献 . https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html[Arrays JavaDoc]。 https://docs.oracle.com/javase/8/docs/api/java/lang/System.html[System JavaDoc]。 http://www.journaldev.com/753/how-to-copy-arrays-in-java[コピーする方法 Javaでの配列] リンク://タグ/配列/[配列]リンク://タグ/コピー/[コピー]