知っていると便利な章

4.15. 配列コピー

『目的』

配列から配列へのコピーのお得な方法を知りましょう。

『Before』

配列から配列へコピーするのに何も考えず正直に行うと以下のような実装になりますね。

int[] array;
// :
int length = array.length;
int[] copy = new int[length];

for (int i = 0; i < length; i++) {
    copy[i] = array[i];
}

forループでグルグル繰り返して移し替えしてます。

もっと簡単な方法があります。

『After』

スマートなコピーです。

int[] array;
// :
/* for ループを置き換えた。 */
int[] copy = Arrays.copyOf(array, array.length);

forループの繰り返しがなくなった分すっきりしましたね。 おまけにcopyOfは内部的にネイティブメソッドを使用しているので実行速度の面でも有利です。
また、Arraysクラスには範囲を指定して配列をコピーするためのcopyOfRangeメソッドもあります。
新たに配列を生成するのではなく、既存の配列領域にコピーする場合はSystem.arraycopyメソッドの使用も検討してください。

なお、コピーには2種類のコピーがあることに注意してください。

シャローコピー(shallowコピー)
 コピー先のオブジェクトに対し、そのオブジェクトの参照情報のみ複写する方法です。
 つまりコピー元、コピー先とも同じオブジェクトを参照しています。
 コピー先のオブジェクトの値を変更するとコピー元のオブジェクトの値も変更されます。

ディープコピー(deepコピー)
 コピー先のオブジェクトに対し、参照情報だけでなくオブジェクトの実体も複写する方法です。
arraycopy や「=」によるコピーはシャローコピーになります。

『まとめ』

使えるものは使いましょう。

< 前のページへ

Pagetop