English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java プロセス制御

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 例外処理

Java リスト(List)

Java キュー(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Java 他のトピック

Java 配列のコピー

このチュートリアルでは、Javaで配列(一次元および二次元)をコピーするための異なる方法を、サンプルの助けにより学びます。

 Javaでは、配列を別の配列にコピーすることができます。Javaで配列をコピーするために使用できる技術はいくつかあります。

1代入演算子を使用して配列をコピーします

例を示しましょう

class Main {
    public static void main(String[] args) {
       
        int[] numbers = {1, 2, 3, 4, 5, 6};
        int[] positiveNumbers = numbers;    //配列をコピーします
        for(int number : positiveNumbers) {
            System.out.print(number + "");
        }
    }
}

出力

1, 2, 3, 4, 5, 6

 上記の例では、numbers配列をpositiveEnumbers配列にコピーするために、名前がnumbersの配列を名前がpositiveEnumbersの配列にコピーするために、代入演算子(=)を使用しました。

 この技術は最もシンプルな方法の1つですが、効果的です。しかし、この技術には問題があります。配列の要素を変更すると、他の配列の対応する要素も変更されます。例えば、

class Main {
    public static void main(String[] args) {
      
        int[] numbers = {1, 2, 3, 4, 5, 6};
        int[] positiveNumbers = numbers;    //配列をコピーします
      
        //第1つの配列の値を変更します
        numbers[0] = -1;
        //第2つの配列を印刷します
        for(int number : positiveNumbers) {
            System.out.print(number + "");
        }
    }
}

出力

-1, 2, 3, 4, 5, 6

 ここでは、numbers配列の1つの値が変更されたことがわかります。positiveNumbers配列を印刷すると、同じ値が変更されたこともわかります。

これは、2つの配列が同じ配列オブジェクトを参照しているためです。これは浅いコピーのためにです。浅いコピーに関する詳細情報を知りたい場合は、以下のURLにアクセスしてください。浅いコピー

現在、配列をコピーする際に新しい配列オブジェクトを生成する必要があるため、浅いコピーではなく深いコピーを行う必要があります。

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];
        //要素をソースからターゲットにコピーし、反復します
        for (int i = 0; i < source.length; ++i) {
            destination[i] = source[i];
        }
      
         //配列を文字列に変換
        System.out.println(Arrays.toString(destination));
    }
}

出力

[1, 2, 3, 4, 5, 6]

上記の例では、forループを使用してソース配列の各要素を巡回しました。各イテレーションで、ソース配列からdestination配列に要素をコピーしました。

ここでは、ソースとターゲット配列は異なるオブジェクトを参照しています(深いコピー)。したがって、配列の要素が変更された場合、もう一方の配列の対応する要素も変更されません。

次の文に注意してください、

System.out.println(Arrays.toString(destination));

ここでは、toString()メソッドは配列を文字列に変換するために使用されています。

3.arraycopy()メソッドを使用して配列をコピー

Javaでは、Systemクラスパッケージには、arraycopy()メソッドを用いて配列をコピーするためのメソッドが含まれています。上記の2つの方法に比べて、これは配列をコピーするためのより良い方法です。

 メソッドは、ソース配列の指定された部分をターゲット配列にコピーすることができます。例えば、

arraycopy(Object src, int srcPos,Object dest, int destPos, int length)

ここでは、

  • src -コピーしたいソース配列

  • srcPos -ソース配列の開始位置(インデックス)

  • dest -ターゲット配列、ソースから要素をコピー

  • destPos -ターゲット配列の開始位置(インデックス)

  • length -コピーする要素の数

例を示しましょう:

//Arrays.toString()メソッドを使用して
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];
        //長さがn1のn2配列
        int[] n2 = new int[n1.length];
      
        //全体のn1配列をnにコピー2
        System.arraycopy(n1, 0, n2, 0, n1.length);
        System.out.println("n2 = " + Arrays.toString(n2));  
      
         //からn1配列のインデックス2コピー要素
         //をnにコピー3配列のインデックス1
        //をコピー2個の要素
        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) - nを1配列の全ての要素がnにコピーされます2配列中

  • System.arraycopy(n1, 2, n3, 1, 2 )-  インデックスから2始まるn1配列の2つの要素がnからコピーされます3配列1始めのインデックスに

ご覧の通り、int型配列の要素のデフォルトの初期値は0です。

4.使用copyOfRange()メソッドで配列をコピー

.使用copyOfRange()メソッドで配列をコピーさらに、以下を使用できます。Java Arrays

//toString()とcopyOfRange()メソッドを使用して、クラス内で定義されたcopyOfRange()メソッドを使用して配列をコピーします。例えば、
import java.util.Arrays;
class ArraysCopy {
    public static void main(String[] args) {
      
        int[] source = {2, 3, 12, 4, 12, -2};
      
        //元の配列全体をコピーして、ターゲットに配置します。
        int[] destination1 = Arrays.copyOfRange(source, 0, source.length);      
        System.out.println("destination1 = " + Arrays.toString(destination1)); 
      
        //インデックスから2にコピーする5(5) 
        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);

ここでは、destinationの作成が見られます1配列をコピーして同時に元の配列をそれにコピーします。copyOfRange()メソッドを呼び出す前に、destinationは作成されません。1メソッドの詳細については、以下のURLを参照してください。Java copyOfRange

5.使用ループで二次元配列をコピー

一次元配列と同様に、二次元配列もforループを使用してコピーできます。例えば、

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) {
            //ターゲット配列の各行にスペースを割り当てます。
            destination[i] = new int[source[i].length];
            for (int j = 0; j < destination[i].length; ++j) {
                destination[i][j] = source[i][j];
            }
        }
     
        //ターゲット配列を表示
        System.out.println(Arrays.deepToString(destination));  
      
    }
}

出力

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

上記のプログラムでは、以下の行に注意してください:

System.out.println(Arrays.deepToString(destination);

ここでは、deepToString()メソッドを使用して二次元配列のより良い表示を提供します。さらに詳しい情報は、以下のURLを参照してください。Java deepToString()

使用arraycopy()を二次元配列に適用

为了使上面的代码更簡単,System.arraycopy()を使用して内部ループを置き換えることができます。一次元配列のように処理できます。例えば、

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) {
             //ターゲット配列の各行にスペースを割り当てます。
             destination[i] = new int[source[i].length];
             System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
        }
     
        //ターゲット配列を表示
        System.out.println(Arrays.deepToString(destination));      
    }
}

出力

[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]

 ここでは、arraycopy()メソッドを使用して内部のforループを置き換えることで、同じ出力を得ることができます。