• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ArrayListのcloneメソッド)

ArrayListのcloneメソッドについて

このQ&Aのポイント
  • ArrayListのcloneメソッドはシャローコピーとなっています。
  • 要素自体はコピーされず、同じオブジェクトを参照します。
  • 試したソースコードでは、arrayとarray2が別々のオブジェクトを参照していることが確認できます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> このシャローコピーとディープコピーはどのように使い分けたらいいですか? Stringはimmutable objectなので、出しておられる例では、シャローコピーとディープコピーの差が生まれないですね。immutable objectとは、御存知の通り、変更ができないオブジェクトのことで、String、Integer、Float、Doubleのようなものが相当します。変更ができないことが保証されていることで、オブジェクト全体の複製は参照をコピーするだけで済み、メモリーの効率的な利用や複製のためのオーバヘッド低減にもつながります。 もし、中に入っているオブジェクトがmutable objectである場合、シャローコピーとディープコピーに差が生まれます。例えば、次の例のような場合に違いが出ます。 import java.util.ArrayList; class Animal { private String name; public Animal(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String toString() { return this.name; } } public class Test2 { public static void main(String[] args) { ArrayList<Animal> aliceFavoriteAnimals = new ArrayList<Animal>(); aliceFavoriteAnimals.add(new Animal("cat")); aliceFavoriteAnimals.add(new Animal("dog")); System.out.println("Alice:" + aliceFavoriteAnimals); ArrayList<Animal> bobFavoriteAnimals = (ArrayList<Animal>) aliceFavoriteAnimals.clone(); bobFavoriteAnimals.get(0).setName("kitten"); System.out.println("Alice:" + aliceFavoriteAnimals); System.out.println("Bob:" + bobFavoriteAnimals); } } シャローコピーなので、Bob用にbobFavoriteAnimalsを書き換えると、それがaliceFavoriteAnimalsにも影響します。 ついでに言うと、clone()のような簡単な方法でディープコピーをするの方はないので、ライブラリーを使ったほうが楽ですね。 http://code.google.com/p/cloning/ 当然、ディープコピーはその要素のひとつひとつをたどってコピーをしていくので、シャローコピーと比べて遅いです。Immutableなオブジェクトや変更しないことが保証されているオブジェクトが中に入っている場合はシャローコピー、変更の可能性がある場合はディープコピーを使うべきですね。先の例だと、AnimalクラスにsetNameがない場合はオブジェクトの中身を変更できないのでシャローコピーで十分です。もちろん、それによってプログラムの書き方も変わりますが。

heaven4869
質問者

お礼

おぉ!なるほど! Javaの世界もディープですね(笑) わかりやすい説明ありがとうございました!

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.2

>このシャローコピーとディープコピーはどのように使い分けたらいいですか? 違いがわかれば自明だと思いますけど。 ディープコピーは実行コストが高いので、ディープコピーの必要が無ければシャローコピーで。 ディープコピーの必要があればディープコピーで。

heaven4869
質問者

補足

では、単純にArrayListをコピーしたい場合は、cloneメソッドを使用すればいいのですね?

  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.1

>恐らく大きな勘違いをしているのかもしれませんが、 はい勘違いしています。 >array:[a, b, c] >array2:[a, b, c] >となるはずが、 array と array2 は別のオブジェクトですからそうはなりません。 シャローコピーなので、array.get(0) と array2.get(0) は同一オブジェクトで、array.get(1) と array2.get(1) も同一オブジェクトです。 ディープコピーも、シャローコピーも、コピーには違いないので、コピーされたオブジェクト自体はコピー元と別オブジェクトで、オブジェクトが中に持つ中身のオブジェクト(この場合はStringのオブジェクト)をコピーするのか、同一の物を使い回すのかが違うだけです。

heaven4869
質問者

補足

なるほど! ArrayListではなく、Stringが対象なんですね。 大きな勘違いですね(汗) では、参考までに聞きたいのですが、 このシャローコピーとディープコピーはどのように使い分けたらいいですか?

関連するQ&A