【Java】copyOfを使って配列(Array)をコピーし、新しい配列を作成する!
配列(Array)をコピーし、新しい配列を作成するにはArrayクラスのcopyOfメソッドを使用します。
ArraysクラスのcopyOfメソッドは、配列のコピーして新しい配列を作成するメソッドとなります。
ArraysクラスのcopyOfメソッドを使用することでコピーしたい配列の要素数を設定して新しい配列を作成したり、コピーしたい配列の要素を全てコピーして新しい配列を作成することもできます。
今回はArraysクラスのtcopyOfメソッドを使って以下の場合で配列をコピーし、新しい配列を作成していきます。
⚫︎ コピーする配列の要素数を指定して新しい配列を作成する場合
⚫︎ コピーする配列の要素を全てコピーして新しい配列を作成する場合
⚫︎ コピーする配列の要素数より指定する要素数の方が多い状態で新しい配列を作成する場合
⚫︎ コピーする配列の要素数を負の数で指定し、新しい配列を作成する場合
⚫︎ コピーする配列がnullの状態で新しい配列を作成する場合
また、以下の場合で多次元配列をコピーし、新しい配列を作成する方法についても紹介していきます。
⚫︎ 多次元配列をコピーして新しい多次元配列を作成する場合
⚫︎ 多次元配列をコピーして新しい一次元配列を作成する場合
目次
copyOfメソッドとは
ArrayクラスのcopyOfメソッドとは、配列の要素コピーするメソッドであり、指定された配列をコピーし、指定された要素数分を新しい配列にコピーします。
copyOfメソッドの書き方
AarrayクラスのcopyOfメソッドの構文は下記となります。
1 2 3 |
import java.util.Arrays; Arrays.copyOf(配列, コピーする要素数); |
Arrayクラスをインポートすることで、Arraysクラスのメソッドを使用できます。
パラメータ
⚫︎ 配列:
コピーしたい配列を指定する
⚫︎ コピーする要素数:
コピーしたい要素の数を指定する(スタートは一番左から)
copyOfの()に第1パラメータとして配列を、第2パラメータとして要素数を指定することで配列の要素数だけ新しい配列にコピーします。
配列をコピーして新しい配列を作成するサンプルコード
配列をコピーして新しい配列を作成するサンプルコードを紹介します。
コピーする要素数を指定する場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[] array1 = {9, 8, 21, 33, 15}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.toString(array1)); // 要素をすべてコピーする int[] newArray1 = Arrays.copyOf(array1, 3); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray1)); } } |
出力結果
・ コピーされる配列
[9, 8, 21, 33, 15]
・ コピーした新しい配列
[9, 8, 21]
copyOfメソッドの第二引数に数値を指定することで指定した数値分だけ配列の要素をコピーしています。
要素を全てコピーする場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[] array2 = {9, 8, 21, 33, 15}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.toString(array2)); // 要素をすべてコピーする int[] newArray2 = Arrays.copyOf(array2, array2.length); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray2)); } } |
出力結果
・ コピーされる配列
[9, 8, 21, 33, 15]
・ コピーした新しい配列
[9, 8, 21]
copyOfメソッドの第2パラメータに配列の長さを指定することで配列の要素を全てコピーしています。
配列の長さを取得するlengthメソッドについてはこちらをご参照ください。
コピーする配列の要素数より指定する要素数の方が多い場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[] array3 = {9, 8, 21, 33, 15}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.toString(array3)); // 要素をすべてコピーする int[] newArray3 = Arrays.copyOf(array3, 7); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray3)); } } |
出力結果
・ コピーされる配列
[9, 8, 21, 33, 15]
・ コピーした新しい配列
[9, 8, 21, 33, 15, 0, 0]
コピーする配列の要素数より指定する要素数の方が多い場合、足りない要素は「0」になります。
指定する要素数が負の数である場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[] array4 = {9, 8, 21, 33, 15}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.toString(array4)); // 要素を負の数に設定 int[] newArray4 = Arrays.copyOf(array4, -3); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray4)); } } |
出力結果
Exception in thread “main” java.lang.NegativeArraySizeException: -3
配列の長さに負の数はない為、エラーが発生します。
コピーする配列がnullの場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[] array5 = null; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.toString(array5)); // 要素をすべてコピーする int[] newArray5 = Arrays.copyOf(array5, array.length); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray5)); } } |
出力結果
Exception in thread “main” java.lang.NullPointerException
コピーする配列がnullであることから、エラーが発生します。
多次元配列をコピーして新しい多次元配列を作成するサンプルコード
二次元配列から新しい二次元配列を作成する場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[][] array1 = {{9, 8, 21},{ 33, 15}}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.deepToString(array1)); // 要素をすべてコピーする int[][] newArray1 = Arrays.copyOf(array1, 3); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.deepToString(newArray1)); } } |
出力結果
・ コピーされる配列
[[9, 8, 21], [33, 15]]
・ コピーした新しい配列
[[9, 8, 21], [33, 15], null]
三次元配列から新しい三次元配列を作成する場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[][][] array1 = {{{9, 8, 21},{33, 15}, {45, 78}}}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.deepToString(array1)); // 要素をすべてコピーする int[][][] newArray1 = Arrays.copyOf(array1, 3); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.deepToString(newArray1)); } } |
出力結果
・ コピーされる配列
[[[9, 8, 21], [33, 15], [45, 78]]]
・ コピーした新しい配列
[[[9, 8, 21], [33, 15], [45, 78]], null, null]
多次元配列をコピーして新しい一次元配列を作成するサンプルコード
二次元配列から新しい一次元配列を作成する場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[][] array1 = {{9, 8, 21},{33, 15}}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.deepToString(array1)); // 要素をすべてコピーする int[] newArray1 = Arrays.copyOf(array1[1], 2); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray1)); } } |
出力結果
・ コピーされる配列
[[9, 8, 21], [33, 15]]
・ コピーした新しい配列
[33, 15]
三次元配列から新しい一次元配列を作成する場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 配列をコピーして新しい配列を作成する import java.util.Arrays; public class Main { public static void main(String[] args) throws Exception { // 元となる配列 int[][][] array1 = {{{9, 8, 21},{33, 15}, {45, 78}}}; // 配列の中身を表示 System.out.println("・ コピーされる配列"); System.out.println(Arrays.deepToString(array1)); // 要素をすべてコピーする int[] newArray1 = Arrays.copyOf(array1[0][0], 3); // コピー先の配列の中身を表示 System.out.println("・ コピーした新しい配列"); System.out.println(Arrays.toString(newArray1)); } } |
出力結果
・ コピーされる配列
[[[9, 8, 21], [33, 15], [45, 78]]]
・ コピーした新しい配列
[9, 8, 21]
今回のポイント
copyOfで配列をコピーして新しい配列を作成
配列をコピーして新しい配列を作成するにはArraysクラスのcopyOfメソッドを使用する
⚫︎ ArraysクラスのcopyOfメソッドで、配列のコピーし、新しい配列を作成する
⚫︎ copyOfメソッドの第1パラメータにはコピー元の配列を、第2パラメータにコピーする要素数を指定する
⚫︎ 要素を全てコピーする場合はcopyOfメソッドの第2パラメータにコピー元の配列.lengthを指定する
⚫︎ copyOfメソッドの第2パラメータが負の数である場合はエラーが発生する
⚫︎ copyOfメソッドでコピーする配列の要素数より第2パラメータのコピーする要素数の方が多い場合、コピーはされるが、足りない要素は「0」になる
⚫︎ copyOfメソッドでコピー元の配列がnullの場合はエラーが発生する
⚫︎ copyOfメソッドで多次元配列をコピーし、新しく一次元配列を作成することも可能
関連記事
インスタンスをコピーするcloneメソッドについてはこちらをご参ください。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。