以下に説明する方法は、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での配列]

リンク://タグ/配列/[配列]リンク://タグ/コピー/[コピー]