4.12. 配列コピー
『目的』
配列から配列へのコピーのお得な方法を知りましょう。
『Before』
配列から配列へコピーするのに何も考えず正直に行うと以下のような実装になりますね。
int[] copyArray(int[] array) {
int length = array.length;
int[] copy = new int[length];
for (int i = 0; i < length; i++) {
copy[i] = array[i];
}
return copy;
}
forループでグルグル繰り返して移し替えしてます。
もっと簡単な方法があります。
『After』
スマートなコピーです。
int[] copyArray(int[] array) {
int length = array.length;
int[] copy = new int[length];
System.arraycopy(array, 0, copy, 0, length); /* for ループを置き換えた。 */
return copy;
}
forループの繰り返しがなくなった分すっきりしましたね。
おまけにarraycopyはネイティブメソッドなので実行速度の面でも有利です。
欠点はパラメータがちょっとわかりにくいところです。
なお、コピーには2種類のコピーがあることに注意してください。
シャローコピー(shallowコピー)
コピー先のオブジェクトに対し、そのオブジェクトの参照情報のみ複写する方法です。
つまりコピー元、コピー先とも同じオブジェクトを参照しています。
コピー先のオブジェクトの値を変更するとコピー元のオブジェクトの値も変更されます。
ディープコピー(deepコピー)
コピー先のオブジェクトに対し、参照情報だけでなくオブジェクトの実体も複写する方法です。
arraycopy や「=」によるコピーはシャローコピーになります。
『まとめ』
使えるものは使いましょう。