Java 配列のクローン

Farkhanda Athar 2023年1月30日 2021年11月18日
  1. Java で for ループを使用して Java 配列を手動でコピーする
  2. Arrays.copyOf() を使用して Java 配列のクローンを作成する
  3. Arrays.copyOfRange() を使用して Java 配列のクローンを作成する
  4. Object.clone() を使用して Java 配列のクローンを作成する
  5. System.arraycopy() を使用して Java 配列を複製する
Java 配列のクローン

Java 配列は、次の方法で別の配列にコピーできます。

  • 変数割り当ての使用:配列要素への変更は両方の場所に反映されるため、この手法には欠点があります。
  • 同じサイズの配列を作成し、すべての要素をコピーします。
  • アレイへのクローン手法を利用します。クローンメソッドは、同様のサイズのまったく新しいアレイを作成します。
  • System.arraycopy() テクニックを利用します。arraycopy は、配列から特定の部分をコピーする方法です。

Java で for ループを使用して Java 配列を手動でコピーする

通常、ab などの変数をコピーする瞬間に、次の方法でコピー操作を実行します。

public class Main 
{ 
     public static void main(String[] args) 
    {
         int IArray[] = {24,45,56}; 
       
        System.out.println("Before assignment the values of IArray[] are:"); 
        for (int i=0; i<IArray.length; i++) 
             System.out.print(IArray[i] + " ");
 
        int CArray[] = new int[IArray.length]; 
 
        CArray =  IArray;     
        CArray[1]++; 
 
        System.out.println("\nElements of IArray[]:"); 
        for (int i=0; i<IArray.length; i++) 
              System.out.print(IArray[i] + " "); 
 
        System.out.println("\nElements of CArray[]:"); 
        for (int i=0; i<CArray.length; i++) 
              System.out.print(CArray[i] + " "); 
    } 
}

出力:

Before assignment the values of IArray[] are:
24 45 56 
Elements of IArray[]:
24 46 56 
Elements of CArray[]:
24 46 56 

これと同じ手順をアレイに適用すると、効果がなくなります。

Arrays.copyOf() を使用して Java 配列のクローンを作成する

Arrays.copyOf() であるこのメソッドは、System.arraycopy() プロシージャの内部使用に役立ちます。配列コピーほど効果的ではありませんが、配列コピー方法と同様に、配列の全部または一部を複製する可能性があります。copyOf() メソッドは java.util パッケージの要素であり、Arrays クラスの一部です。この方法の背後にある基本的な考え方は次のとおりです。

public class Main
{
    public static void main(String args[])
    {

        int[] OArray = new int[] {11, 12 ,13};

        System.out.println("Original Arrays elements are");
        for (int i = 0; i < OArray.length; i++)
            System.out.print(OArray[i] + " ");


        int[] CArray = Arrays.copyOf(OArray, 5);

        
        CArray[3] = 22;
        CArray[4] = 66;

        System.out.println("\nNew array after copying and modification are:");
        for (int i = 0; i < copy.length; i++)
            System.out.print(copy[i] + " ");
    }
}

出力:

Original Arrays elements are
11 12 13 
New array after copying and modification are
11 12 13 22 66 

ここでは、

  • original:新しく作成されたアレイにコピーされるアレイ。
  • newLength:コピーされた配列の長さで、返されます。

したがって、このメソッドは、新しい配列を作成するために 0 を追加して長さをパディングまたは切り捨てることにより、指定されたサイズの最初の引数として提供された配列の正確なコピーを作成します。これは、コピーされた配列のサイズが元々配列 0 にあったものよりも大きい場合、残りの要素の代わりに s が使用されることを意味します。

Arrays.copyOfRange() を使用して Java 配列のクローンを作成する

メソッド Arrays.copyOfRange() は、配列の一部をコピーするように特別に設計されています。同様の toCopyOf() メソッドは、System.arraycopy() 手法を利用します。Arrays.copyOfRange() プロシージャの背後にある基本的な考え方は、次のように説明できます。

import java.util.Arrays;

class Main {
     public static void main(String args[]) 
    {
         int IArray[] = { 100,200,300,400,500 }; 
 
        int[] CArray = Arrays.copyOfRange(IArray, 2, 6); 
        System.out.println("Array within the index range : " + 
        Arrays.toString(CArray));
 
       int[] CArray1 = Arrays.copyOfRange(IArray, 4, IArray.length + 3); 
 
       System.out.println("Array copied within the indexed range: " + Arrays.toString(CArray1));
 
    } 
}

出力:

Array within the index range : [300, 400, 500, 0]
Array copied within the indexed range: [500, 0, 0, 0]

ここでは、

  • original:コピーされる範囲の配列。
  • from:コピーする配列のインデックス。
  • to:コピーされる範囲のインデックスであり、排他的です。

Object.clone() を使用して Java 配列のクローンを作成する

Java 配列は内部で Cloneable インターフェースを実装しているため、Java 配列のクローンを作成するのは簡単です。1 次元および 2 次元の配列のクローンを作成することができます。1 次元配列をコピーすると、値をコピーする配列要素の広範なレプリカが作成されます。

一方、2 次元または多次元の配列をコピーすると、要素の小さなコピーが作成されます。つまり、参照情報のみがコピーされます。このクローン作成プロセスは、アレイに提供されているクローン() メソッドを使用して実行されます。

class Main 
{     
     public static void main(String args[])  
    {
     int NArray[] = {50,100,150,200,250,300}; 
 
     int CArray[] = NArray.clone(); 
 
    System.out.println("Original Num Array are:");
    for (int i = 0; i <NArray.length; i++) {
            System.out.print(NArray[i]+" "); 
        } 
    System.out.println();
 
    System.out.println("Cloned Num Array are:");
    for (int i = 0; i <CArray.length; i++) {
        System.out.print(CArray[i]+" "); 
        } 
    System.out.println("\n");
 
    System.out.print("NArray == CArray = "); 
    System.out.println(NArray == CArray); 
    } 
}

出力:

Original Num Array are:
50 100 150 200 250 300 
Cloned Num Array are:
50 100 150 200 250 300 

NArray == CArray = false

System.arraycopy() を使用して Java 配列を複製する

Java の System クラスには、ある配列から別の配列に要素をコピーできる ArrayCopy と呼ばれるオプションが用意されています。このメソッドの最も一般的なモデルは次のとおりです。

class Main {
    public static void main(String[] args) {
        //declaring a source array  
        char[] Oarray = { 'I','L','o','v','e','M','y','C','o','u','n','t','r','y'}; 
  
        char[] Farray = new char[14];  
 
        System.arraycopy(Oarray, 0, Farray, 0,14);
        System.out.println("Origional Array Elements are:" + String.valueOf(Oarray));
 
        System.out.println("Arrays after copying elements are:"+ String.valueOf(Farray));  
    }  
}

出力:

Origional Array Elements are:ILoveMyCountry
Arraya after copying elements are:ILoveMyCountry

ここ、

  • src_array:アイテムのコピー元のソース配列。
  • src_Pos:ソース配列内の場所は、コピーが開始されるポイントです。
  • dest_array:要素がコピーされる宛先の配列。
  • dest_Pos:コピーするアイテムの宛先の配列内の開始位置。
  • length:コピーされる配列の長さ。

関連記事 - Java Array