【Java学習|初心者向け】Javaで配列を安全かつスマートにコピーする:Arrays.copyOfとArrays.copyOfRangeの活用術

1. 導入:なぜ配列のコピーが重要なのか

Javaでプログラミングをしていると、既存の配列を別の配列にコピーしたい場面によく遭遇します。しかし、単に「配列A = 配列B」と代入するだけでは、実は「参照(メモリ上の場所)」をコピーしているだけで、中身のデータは共有されたままです。これでは片方を変更するともう片方も変わってしまうというバグの温床になります。
今回解説する「Arrays.copyOf」と「Arrays.copyOfRange」を使えば、配列の複製を安全かつ簡潔に作成できます。

2. 基礎知識:配列の複製とは

Javaの配列は、一度サイズが決まると変更できません。そのため、要素を追加したり、一部を切り出したりしたい場合は、新しいサイズの配列を新しく作り、そこに要素を移す必要があります。
Arraysクラスは、java.utilパッケージに含まれる、配列操作のための便利な道具箱のようなクラスです。その中でも、コピー系のメソッドは、手動でfor文を回してコピーする手間を省き、コードを読みやすくするために必須のテクニックです。

3. 実装/解決策:用途に応じた使い分け

配列全体をコピーしたい場合は Arrays.copyOf を、特定の範囲だけを抜き出したい場合は Arrays.copyOfRange を使用します。

・Arrays.copyOf(original, newLength)
元の配列をコピーし、指定した長さの新しい配列を作成します。元の長さより大きく指定すれば、不足分は初期値(数値なら0、参照型ならnull)で埋められます。

・Arrays.copyOfRange(original, from, to)
元の配列の「開始インデックス(from)」から「終了インデックス(toの直前まで)」を切り出して新しい配列を作成します。

4. サンプルプログラム

以下のコードをコピーして、ご自身の環境で実行してみてください。

import java.util.Arrays;

public class ArrayCopyExample {
    public static void main(String[] args) {
        int[] original = {10, 20, 30, 40, 50};

        // 1. 配列全体をコピー(サイズ拡張も可能)
        int[] copiedAll = Arrays.copyOf(original, 5);
        System.out.println("全体コピー: " + Arrays.toString(copiedAll));

        // 2. 配列の範囲を指定してコピー(インデックス1から4の前まで、つまり1, 2, 3番目)
        int[] copiedRange = Arrays.copyOfRange(original, 1, 4);
        System.out.println("範囲コピー: " + Arrays.toString(copiedRange));

        // 3. サイズを大きくしてコピー(不足分は0で埋められる)
        int[] expanded = Arrays.copyOf(original, 8);
        System.out.println("拡張コピー: " + Arrays.toString(expanded));
    }
}

5. 応用・注意点:現場で役立つポイント

現場で使う際に注意すべき点は「シャローコピー(浅いコピー)」であることです。
もし配列の中身が「オブジェクト(Stringや自作クラスなど)」の場合、配列自体は新しくなりますが、中身のオブジェクトは同じメモリを参照しています。配列の中身のインスタンスまで完全に別物にするには「ディープコピー」が必要になりますので、オブジェクトの配列を扱う際は注意してください。

また、copyOfRangeの「to」インデックスは「その値は含まない」というルールです。ここを間違えるとIndexOutOfBoundsException(範囲外例外)が発生しやすいので、実装時は必ずインデックスの終端を確認する癖をつけましょう。これらを使いこなすことで、Javaでのデータ操作が格段に安全で効率的になります。

コメント

タイトルとURLをコピーしました