3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javaの配列におけるCloneメソッドとは[Clone method for Java arrays]を訳してみた。

Last updated at Posted at 2019-07-01

Javaの配列におけるclone()についての分かりやすい説明を見つけたので訳してみました。

[引用]stackoverflow
Clone method for Java arrays


cloneメソッドが配列に呼び出される時、同じ配列要素の新しいインスタンスを返却します。
例えば、次のコードではint[]aint[]bでは違うインスタンスを生成します。


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

    * a == b ? aとbが同じインスタンスかという判定
    System.out.println(a == b ? "同じインスタンスです":"違うインスタンスです");
    //出力: 違うインスタンスです

2つは異なるインスタンスなので、int[]bに対する変更は、int[]aには影響しないということになります。


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

これがオブジェクトの配列操作となると少しややこしい話になります。(配列の場合)クローンメソッドにより新しい配列の参照先を返却します。これはコピー元の配列オブジェクトと同じ参照先になります。

例えば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をクローンすると・・・

    Dog[] myDogsClone = myDogs.clone();

2つは同じ要素を参照します。


    System.out.println(myDogs[0] == myDogsClone[0] ? "同じ":"違う");
    System.out.println(myDogs[1] == myDogsClone[1] ? "同じ":"違う");
    System.out.println(myDogs[2] == myDogsClone[2] ? "同じ":"違う");
    System.out.println(myDogs[3] == myDogsClone[3] ? "同じ":"違う");
    //出力: 同じ (4回)

これはどうゆうことかというと、2つは同じ参照先なのでクローンした配列に対して変更を加えた場合、その変更がもともとの配列にも反映されるということです。

    // myDogsCloneに変更を加えると、myDogsの要素の値にも反映される。
    myDogsClone[0].setName("Ruff"); 
    System.out.println(myDogs[0].getName());
    //出力: Ruff

しかし、配列に対して新しくインスタンスを作成するとその変更は元のインスタンスに影響しません。

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

とても勉強になりました!:relaxed:

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?