Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Arrays.copyOf() / Arrays.copyOfRange() / Arrays.fill()
配列をコピーして新しい配列を作成したり、配列の全要素または指定範囲を特定の値で埋めたりするメソッドです。java.util.Arrays クラスの静的メソッドとして提供されています。
構文
import java.util.Arrays; // 配列をコピーして指定した長さの新しい配列を返します。 Arrays.copyOf(original, int newLength); // 指定した範囲をコピーして新しい配列を返します。 Arrays.copyOfRange(original, int from, int to); // 配列全体を指定した値で埋めます(破壊的操作)。 Arrays.fill(array, value); // 指定した範囲を指定した値で埋めます(破壊的操作)。 Arrays.fill(array, int fromIndex, int toIndex, value); // 高速な配列コピーを行います。 System.arraycopy(src, int srcPos, dest, int destPos, int length);
メソッド一覧
| メソッド | 概要 |
|---|---|
| Arrays.copyOf(original, newLength) | 配列をコピーします。newLength が元の長さより長い場合、余った要素はデフォルト値(0, null など)で埋められます。 |
| Arrays.copyOfRange(original, from, to) | from から to の直前までの範囲をコピーした新しい配列を返します。 |
| Arrays.fill(array, value) | 配列のすべての要素を value で上書きします。元の配列を直接変更します。 |
| Arrays.fill(array, fromIndex, toIndex, value) | 配列の fromIndex から toIndex の直前までを value で上書きします。 |
| System.arraycopy(src, srcPos, dest, destPos, length) | 低レベルなネイティブ実装による高速配列コピーです。大量データのコピーに向いています。 |
サンプルコード
import java.util.Arrays;
// Arrays.copyOf() で配列をコピーします。
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, 3); // 先頭3要素をコピーします。
System.out.println(Arrays.toString(copy)); // 『[1, 2, 3]』と出力されます。
// 長さを増やしてコピーします(余った部分は 0 で埋まります)。
int[] extended = Arrays.copyOf(original, 8);
System.out.println(Arrays.toString(extended)); // 『[1, 2, 3, 4, 5, 0, 0, 0]』と出力されます。
// Arrays.copyOfRange() で範囲を指定してコピーします。
int[] range = Arrays.copyOfRange(original, 1, 4); // インデックス1〜3をコピーします。
System.out.println(Arrays.toString(range)); // 『[2, 3, 4]』と出力されます。
// Arrays.fill() で全要素を埋めます。
int[] filled = new int[5];
Arrays.fill(filled, 7);
System.out.println(Arrays.toString(filled)); // 『[7, 7, 7, 7, 7]』と出力されます。
// 範囲を指定して埋めます。
int[] partial = {0, 0, 0, 0, 0};
Arrays.fill(partial, 1, 4, 9); // インデックス1〜3を9で埋めます。
System.out.println(Arrays.toString(partial)); // 『[0, 9, 9, 9, 0]』と出力されます。
// System.arraycopy() で高速コピーします。
int[] src = {10, 20, 30, 40, 50};
int[] dest = new int[5];
System.arraycopy(src, 1, dest, 0, 3); // src の1〜3番目を dest の先頭からコピーします。
System.out.println(Arrays.toString(dest)); // 『[20, 30, 40, 0, 0]』と出力されます。
概要
『Arrays.copyOf()』と『Arrays.copyOfRange()』は新しい配列を返すため、元の配列には影響しません。配列のサイズを変更したいときにも利用できます。配列はオブジェクト配列の場合、参照のコピーになります(シャローコピー)。参照先のオブジェクトを書き換えると元の配列にも影響するため、独立したコピーが必要な場合はディープコピーを実装してください。
『Arrays.fill()』は配列を初期化するときによく使われます。ゲームのマップ初期化や初期値セットアップなど、全要素を同じ値にしたい場合に便利です。
配列の並べ替えには『Arrays.sort()』、配列の比較・文字列化には『Arrays.equals() / Arrays.toString()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。