java copy array how copy clone an array java
配列のコピーとクローン作成に関するこのチュートリアルでは、Javaで配列をコピーするためのさまざまな方法について説明します。
ここでは、Java配列のコピー操作について説明します。 Javaには、配列要素のコピーを作成するためのさまざまな方法が用意されています。ご存知のとおり、Javaでは、配列にはプリミティブ型、オブジェクト、または参照のいずれかの要素を含めることができます。
プリミティブ型のコピーを作成するとき、タスクはかなり簡単ですが、オブジェクトまたは参照に関しては、コピーが深いか浅いかに注意する必要があります。
浅いコピーは要素のコピーを作成します。プリミティブデータ型が関係している場合は問題ありません。ただし、参照が含まれる場合、浅いコピーは値をコピーするだけで、基になる情報はコピーしません。
したがって、要素のコピーを作成した場合でも、メモリ位置が共有されるため、1つのコピーの変更は他のコピーにも反映されます。これを防ぐには、メモリの場所が共有されていないディープコピーを使用する必要があります。
学習内容:
Java配列のコピーとクローン作成
Javaでは、java.utilまたはSystemクラスによって提供される直接コピーメソッドを使用して配列をコピーできます。また、配列全体のクローンを作成するために使用されるクローンメソッドも提供します。
このチュートリアルでは、アレイのコピーとクローン作成の次の方法について説明します。
- forループを使用した手動コピー
- System.arraycopy()の使用
- Arrays.copyOf()の使用
- Arrays.copyOfRange()の使用
- Object.clone()の使用
探検しよう!
Forループを使用した手動コピー
通常、aやbなどの変数をコピーする場合、次のようにコピー操作を実行します。
a = b;
同じ方法を配列に適用すると、正しく機能しません。
プログラミングの例を見てみましょう。
public class Main { public static void main(String() args) { int intArray() = {12,15,17}; //print original intArray System.out.println('Contents of intArray() before assignment:'); for (int i=0; i 出力:

上記のプログラムには、intArrayとcopyArrayの2つの配列があります。タスクは、intArrayの内容をcopyArrayにコピーすることです。これを行うために、ステートメントcopyArray = intArrayが導入されています。ここで行われるのは、配列の参照が割り当てられることです。したがって、これは実際のコピーではありません。
上記のステートメントの結果として、intArrayのメモリ位置はcopyArrayによっても共有されます。これで、copyArray要素がインクリメントされると、その変更はintArrayにも反映されます。これは出力に示されています。
この問題を克服するために、forループを使用して配列をコピーする方法を採用しています。ここでは、元の配列の各要素がforループを使用して新しい配列にコピーされます。
このプログラムを以下に示します。
public class Main { public static void main(String() args) { int intArray() = {12,15, 17}; // define an array copyArray to copy contents of intArray int copyArray() = new int(intArray.length); // copy contents of intArray to copyArray for (int i=0; i 出力:

ここでは、前のプログラムを変更してforループとinside forループを含め、intArrayの各要素をcopyArrayの対応する要素に割り当てています。このようにして、要素は実際にコピーされます。したがって、1つのアレイが変更されても、その変更は別のアレイには反映されません。
System.arraycopy()の使用
JavaのSystemクラスには、ある配列の要素を別の配列にコピーできる「ArrayCOpy」というメソッドがあります。
このメソッドの一般的なプロトタイプは次のとおりです。
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
ここに、
- src_array =>コンテンツのコピー元のソース配列。
- src_Pos =>コピーが開始されるソース配列内の位置。
- dest_array =>要素のコピー先の宛先配列。
- dest_Pos =>コピーする要素の宛先配列の開始位置。
- 長さ =>コピーする配列の長さ。
この方法を例を挙げて理解しましょう。
class Main { public static void main(String() args) { //declaring a source array char() src_array = { 'S','o','f','t','w','a','r','e','T','e','s','t','i','n','g','H','e','l','p'}; char() dest_array = new char(19); System.arraycopy(src_array, 0, dest_array, 0,19); System.out.println('Source array:' + String.valueOf(src_array)); System.out.println('Destination array after arraycopy:'+ String.valueOf(dest_array)); } }
出力:

上記のプログラムでは、「arraycopy」メソッドを使用して、配列を別の配列にコピーします。 arraycopyメソッドの呼び出しを確認できます。ソース配列を最初からコピーします(0th場所)、アレイ全体をコピーします。
最後に、ソース配列と宛先配列の両方に相当する文字列を表示します。
arraycopyメソッドを使用すると、要素の開始位置と終了位置を引数として取るため、部分配列もコピーできます。このメソッドは、配列要素の浅いコピーを作成します。
Arrays.copyOf()の使用
Arrays.copyOf()メソッドは、内部でSystem.arraycopy()メソッドを利用します。 arraycopyほど効率的ではありませんが、arraycopyメソッドと同じように、完全または部分的な配列をコピーするために使用できます。
「copyOf()」メソッドはjava.utilパッケージの一部であり、「Arrays」クラスに属しています。
このメソッドのプロトタイプは次のとおりです。
public static int() copyOf(int() original_array,int newLength)
どこ、
- 元の: 新しいアレイにコピーされるアレイ。
- newLength: 返されるコピーされた配列の長さ。
したがって、このメソッドは、最初の引数で指定された配列のコピーを、長さを0で切り捨てるか、新しい配列にパディングすることによって、指定された長さに作成します。これは、コピーされた配列の長さが元の配列よりも長い場合、残りの要素の0が置き換えられることを意味します。
以下のプログラムは、copyOfメソッドの例を示しています。
importjava.util.Arrays; public class Main { public static void main(String args()) { // define original array int() even_Array = new int() {2,4,6,8}; System.out.println('Original Array:' + Arrays.toString(even_Array)); // copying array even_Array to copy_Array int() copy_Array = Arrays.copyOf(even_Array,5); System.out.println('Copied Array:' + Arrays.toString(copy_Array)); // assign value to unassigned element of copied array copy_Array(4) = 10; System.out.println('Copied and modified Array:' + Arrays.toString(copy_Array)); } }
出力:

上記のプログラムでは、copyOfメソッドを使用して長さ4のeven_Arrayをコピーします。提供される2番目の引数は5です。したがって、新しくコピーされた配列には5つの要素が含まれます。元の配列の長さが新しい配列の長さよりも短いため、最初の4つは元の配列と同じであり、5番目の要素はcopyOfがそれを埋めるために0です。
Arrays.copyOfRange()の使用
Arrays.copyOfRange()メソッドは、部分配列をコピーする場合に特に使用されます。 copyOf()メソッドと同様に、このメソッドも内部的にSystem.arraycopy()メソッドを利用します。
Arrays.copyOfRange()メソッドのプロトタイプは次のとおりです。
public static short() copyOfRange(short() original, int from, int to)
どこ、
- 元の: 範囲のコピー元の配列。
- から: コピーする範囲の初期インデックス(両端を含む)。
- に: コピーされる範囲の最終インデックス(排他的)。
copyOfRangeメソッドの実装例を以下に示します。
import java.util.Arrays; class Main { public static void main(String args()) { int intArray() = { 10,20,30,40,50 }; // to index is within the range int() copyArray = Arrays.copyOfRange(intArray, 2, 6); System.out.println('Array copy with both index within the range: ' + Arrays.toString(copyArray)); //to index is out of range int() copy1 = Arrays.copyOfRange(intArray, 4, intArray.length + 3); System.out.println('Array copy with to index out of range: ' + Arrays.toString(copy1)); } }
出力:

Object.clone()の使用
Java配列は内部で複製可能なインターフェースを実装しているため、Java配列の複製は簡単です。 1次元配列と2次元配列のクローンを作成できます。 1次元配列のクローンを作成すると、値をコピーしている配列要素のディープコピーが作成されます。
一方、2次元または多次元の配列を複製すると、要素の浅いコピーが作成されます。つまり、参照のみがコピーされます。このアレイのクローン作成は、アレイが提供する「Clone()」メソッドによって実行されます。
クローン作成の結果としての1-D配列のディープコピーは、次のように表すことができます。

それでは、Javaプログラムに1-D配列のクローンを実装しましょう。
class Main { public static void main(String args()) { int num_Array() = {5,10,15,20,25,30}; int clone_Array() = num_Array.clone(); System.out.println('Original num_Array:'); for (int i = 0; i 出力からわかるように、両方の配列が等しいかどうかをチェックする式はfalseを返します。これは、1次元配列のクローンを作成すると、値が単なる参照ではなく新しい配列にコピーされるディープコピーが生成されるためです。
よくある質問
Q#1)Javaで配列のコピーを作成するにはどうすればよいですか?
回答: 配列をコピーするにはさまざまな方法があります。
- forループを使用して、ある要素を1つずつ別の要素にコピーできます。
- cloneメソッドを使用して、配列のクローンを作成します。
- Systemクラスのarraycopy()メソッドを使用します。
- ArraysクラスのcopyOf()またはcopyOfRange()メソッドを使用します。
Q#2)あるアレイを別のアレイにどのように割り当てますか?
回答: 単純な代入演算子(=)を使用して、配列を別の配列に割り当てることができます。 2つの配列が同じデータ型であり、同じ次元であることを確認する必要があります。
Q#3)浅いコピーと深いコピーとは何ですか?
回答: 浅いコピーでは、問題のオブジェクトまたは配列の属性のみがコピーされます。したがって、コピーされた配列への変更はすべて元の配列に反映されます。 Javaのクローン作成は、浅いコピーの例です。
ブラックボックステストとホワイトボックステストの例
ディープコピーとは、オブジェクトの完全なコピーが必要なコピーであり、そのオブジェクトを複製またはコピーするときに、独立したコピーになります。プリミティブタイプまたは組み込みタイプが含まれる場合、浅いコピーと深いコピーの間に違いはありません。
Q#4)アレイクローンは何をしますか?
回答: 配列の複製方法は、あるオブジェクトの属性を別のオブジェクトにコピーするために使用されます。これを行うために浅いコピーを使用します。
Q#5)配列を配列に格納できますか?
回答: 配列には、同じタイプ(プリミティブまたはオブジェクト)の要素が提供された配列を含めることができます。これは、整数配列を文字列配列に格納できないことを意味します。
結論
このチュートリアルでは、Javaでのコピー配列とクローン配列について説明しました。アレイをコピーしてクローンを作成するためのさまざまな方法/アプローチを見てきました。
これらのメソッドのほとんどは、浅いコピーを実装していることに注意してください。プリミティブデータ型の場合、浅いコピーと深いコピーに違いはありません。ただし、配列にオブジェクトまたは参照が含まれている場合、プログラマーは要件に従ってディープコピーを実装する必要があります。
以降のチュートリアルでは、Java配列についてさらに詳しく調べていきます。
=> EasyJavaトレーニングシリーズをお読みください。
推奨読書