配列

Java – 2次元配列を正しくコピーする(単純な代入はダメ)

Javaで2次元配列を正しくコピーするには、単純な代入ではなく、各行を個別にコピーする必要があります。

単純な代入(例:array2 = array1)では、元の配列とコピー先が同じ参照を共有してしまい、片方を変更するともう片方にも影響が出ます。

正しい方法としては、forループを用いて各行をSystem.arraycopyArrays.copyOfでコピーするか、手動で要素を1つずつコピーします。

2次元配列のコピーにおける注意点

Javaにおいて、2次元配列をコピーする際には、単純な代入を行うと意図しない結果を招くことがあります。

これは、配列が参照型であるためです。

以下に、注意すべきポイントを挙げます。

  • 参照の共有: 単純な代入を行うと、元の配列とコピーした配列が同じメモリを参照します。

これにより、一方の配列を変更すると、もう一方にも影響が出ます。

  • 深いコピーと浅いコピー: 浅いコピーは参照をコピーするだけですが、深いコピーは新しいメモリ領域を確保し、元の配列の要素を一つ一つコピーします。
  • 配列のサイズ: 2次元配列のサイズが異なる場合、適切にコピーするためには、サイズを考慮する必要があります。

これらの注意点を理解することで、2次元配列を正しくコピーする方法を学ぶことができます。

次のセクションでは、具体的なコピー方法について詳しく解説します。

2次元配列を正しくコピーする方法

2次元配列を正しくコピーするためには、深いコピーを行う必要があります。

以下に、Javaでの2次元配列の深いコピーを実現する方法をいくつか紹介します。

方法1: 手動で要素をコピーする

最も基本的な方法は、ループを使用して各要素を手動でコピーすることです。

以下はそのサンプルコードです。

public class App {
    public static void main(String[] args) {
        // 元の2次元配列
        int[][] originalArray = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        
        // 新しい2次元配列を作成
        int[][] copiedArray = new int[originalArray.length][];
        
        // 各行をコピー
        for (int i = 0; i < originalArray.length; i++) {
            copiedArray[i] = new int[originalArray[i].length]; // 新しい行を作成
            for (int j = 0; j < originalArray[i].length; j++) {
                copiedArray[i][j] = originalArray[i][j]; // 要素をコピー
            }
        }
        
        // コピーした配列の出力
        for (int[] row : copiedArray) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}
1 2 3 
4 5 6 
7 8 9

この方法では、元の配列の各要素を新しい配列に手動でコピーしています。

これにより、元の配列とコピーした配列は異なるメモリ領域を持つため、片方を変更してももう片方には影響しません。

方法2: Arrays.copyOfを使用する

JavaのArraysクラスを利用して、より簡潔にコピーすることも可能です。

以下はそのサンプルコードです。

import java.util.Arrays;
public class App {
    public static void main(String[] args) {
        // 元の2次元配列
        int[][] originalArray = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        
        // 新しい2次元配列を作成
        int[][] copiedArray = new int[originalArray.length][];
        
        // 各行をコピー
        for (int i = 0; i < originalArray.length; i++) {
            copiedArray[i] = Arrays.copyOf(originalArray[i], originalArray[i].length);
        }
        
        // コピーした配列の出力
        for (int[] row : copiedArray) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}
1 2 3 
4 5 6 
7 8 9

この方法では、Arrays.copyOfメソッドを使用して、各行を簡単にコピーしています。

これにより、コードが簡潔になり、可読性が向上します。

方法3: cloneメソッドを使用する

配列のcloneメソッドを使用して、2次元配列をコピーすることもできます。

ただし、これは浅いコピーになるため、注意が必要です。

以下はそのサンプルコードです。

public class App {
    public static void main(String[] args) {
        // 元の2次元配列
        int[][] originalArray = {
                { 1, 2, 3 },
                { 4, 5, 6 },
                { 7, 8, 9 }
        };

        // 浅いコピーを作成
        int[][] shallowCopiedArray = originalArray.clone();

        // 元の配列の要素を変更
        originalArray[0][0] = 100;

        // コピーした配列の出力
        for (int[] row : shallowCopiedArray) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}
100 2 3 
4 5 6 
7 8 9

この方法では、cloneメソッドを使用して配列をコピーしていますが、注意が必要です。

shallowCopiedArrayは元の配列の行を参照しているため、元の配列の要素を変更すると、コピーした配列にも影響が出ます。

以上の方法を理解し、適切な方法を選択することで、2次元配列を正しくコピーすることができます。

まとめ

この記事では、Javaにおける2次元配列のコピー方法について詳しく解説しました。

特に、単純な代入が引き起こす問題や、深いコピーの重要性について触れ、手動でのコピー、Arrays.copyOfメソッドcloneメソッドを用いた方法を紹介しました。

これらの知識を活用して、プログラムの中で配列を正しく扱うことができるようになるでしょう。

ぜひ、実際にコードを書いて試してみてください。

Back to top button