Java – 配列 – コピー

概要

Javaにおける配列のコピーについて整理する。

  • 1次元配列はclone()メソッドかSystem.arraycopy()メソッド
  • 多次元配列は次元分forでネストしてclone()System.arraycopy()

Javaの配列は扱いづらく、deepToString()deepEquals()はあるのにdeepCopy()がないのが不思議。

代入(assignment)

配列変数を他の変数に代入した場合、代入先の変数が元の変数と同じ配列を参照する。一方での変更が他方の結果にも反映される。

下記コードで、2つの配列のハッシュ値が同じこと、片方の変更が他方にも反映されることが確認できる。

clone()

clone()メソッドは配列の要素の「内容」を順次コピーして新たな配列を返す。一方の配列への変更は他方に影響しない。プリミティブ型の配列でも使える。

以下のコードで、2つの変数のハッシュ値が異なること、一方の変更が他方に影響していないことが確認できる。

System.arraycopy()

System.arraycopy()メソッドは引数にコピー元・コピー先の配列とコピー位置、コピー長さを指定して、コピー先にはコピー元の要素が複製された新たな配列が与えられる。clone()と同じく、一方の配列への変更は他方に影響しない。

System.copy(元配列, 元開始位置, 先配列, 先開始位置, コピー長)

clone()はシャローコピー

多次元配列をclone()でコピーしてもディープコピーにはならない。一方の配列への変更が他方に影響する。

以下のコードで、1次元目は違うハッシュ値でコピーされているが、それぞれが持っている要素配列はそのままのハッシュ値でコピーされている。

これは、clone()で元の配列の要素(配列)が新たなインスタンスとして複製されるが、その要素は単に代入されるだけで再帰的に複製されないため。

多次元配列のディープコピー

多次元配列をディープコピーするには、最後の要素までclone()で複製する必要がある。

2つの配列を同時に扱うのにPythonのzipのような機能がないので、カウンターで回さないといけない。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です