1. ホーム
  2. java

[解決済み] Java 配列のクローンメソッド

2023-06-13 14:27:49

質問

Javaでclone()メソッドを配列に使用した場合、具体的に何を返すのでしょうか? それは元のデータからコピーされた新しい配列を返すのですか?

元です。

int[] a = {1,2,3};
int[] b = a.clone();

どのように解決するのですか?

このとき clone メソッドが配列に対して起動されると、ソース配列と同じ要素を含む(または参照する)新しい配列への参照が返されます。

つまり、あなたの例では int[] a はヒープ上に作成された別のオブジェクトのインスタンスであり int[] b はヒープ上に作成された別のオブジェクトのインスタンスです。 (すべての配列はオブジェクトであることを忘れないでください)。

    int[] a = {1,2,3};
    int[] b = a.clone();

    System.out.println(a == b ? "Same Instance":"Different Instance");
    //Outputs different instance

もし int[] b を変更しても、その変更は int[] a には反映されません。

    b[0] = 5;
    System.out.println(a[0]);
    System.out.println(b[0]);
    //Outputs: 1
    //         5

ソース配列にオブジェクトが含まれる場合、これは少し複雑になります。 この場合 clone メソッドは新しい配列への参照を返し、その配列はソース配列と同じオブジェクトを参照します。

ですから、もし私たちがクラス Dog ...

    class Dog{

        private String name;

        public Dog(String name) {
            super();
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }

という型の配列を作成し、それを入力します。 Dog ...

    Dog[] myDogs = new Dog[4];

    myDogs[0] = new Dog("Wolf");
    myDogs[1] = new Dog("Pepper");
    myDogs[2] = new Dog("Bullet");
    myDogs[3] = new Dog("Sadie");

次に犬のクローン...

    Dog[] myDogsClone = myDogs.clone();

配列が同じ要素を参照している...

    System.out.println(myDogs[0] == myDogsClone[0] ? "Same":"Different");
    System.out.println(myDogs[1] == myDogsClone[1] ? "Same":"Different");
    System.out.println(myDogs[2] == myDogsClone[2] ? "Same":"Different");
    System.out.println(myDogs[3] == myDogsClone[3] ? "Same":"Different");
    //Outputs Same (4 Times)

これは、クローン配列からアクセスしたオブジェクトを変更した場合、ソース配列の同じオブジェクトにアクセスすると、同じ参照を指しているため、変更が反映されることを意味します。

    myDogsClone[0].setName("Ruff"); 
    System.out.println(myDogs[0].getName());
    //Outputs Ruff

ただし、配列自体への変更はその配列にのみ影響します。

    myDogsClone[1] = new Dog("Spot");
    System.out.println(myDogsClone[1].getName());
    System.out.println(myDogs[1].getName());
    //Outputs Spot
    //        Pepper

オブジェクトの参照がどのように機能するかを一般的に理解していれば、オブジェクトの配列がクローンや変更によってどのような影響を受けるかを理解するのは簡単です。 参照とプリミティブについてさらに理解を深めるために、私はこの優れた 記事 .

ソースコードのGist