0

Java の ArrayList の clone() メソッドについて質問があります。

ArrayList<HeavyOjbect> original = new ArrayList<HeavyOjbect>();
original.add(new HeavyOjbect(0));
original.add(new HeavyOjbect(1));
original.add(new HeavyOjbect(2));
ArrayList<Integer> copy = original;
copy.remove(0);

オリジナル -> [HeavyOjbect1, HeavyOjbect2]

コピー -> [HeavyOjbect1, HeavyOjbect2]

clone() メソッドを使用するようになりました

ArrayList<HeavyOjbect> original = new ArrayList<HeavyOjbect>();
original.add(new HeavyOjbect(0));
original.add(new HeavyOjbect(1));
original.add(new HeavyOjbect(2));
ArrayList<Integer> copy = (ArrayList<HeavyOjbect>) original.clone();
copy.remove(0);

オリジナル -> [HeavyOjbect0、HeavyOjbect1、HeavyOjbect2]

コピー -> [HeavyOjbect1, HeavyOjbect2]

右 ?

しかし、クローンが何をするのかわかりません。すべての HeavyObject を複製しますか? ArrayList の 1000 倍のクローンを作成した場合、メモリは爆発しますか?

編集:だからクローンで

new HeavyOjbect(0) -> @10
new HeavyOjbect(1) -> @20
new HeavyOjbect(1) -> @30

original(ref1 to @10, ref1 to @20, ref1 to @30)
copy(ref2 to @10, ref2 to @20, ref2 to @30)

右 ?

ありがとう

4

3 に答える 3

6

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#clone()

public Object clone()
この ArrayList インスタンスの浅いコピーを返します。(要素自体はコピーされません。)

への参照のみHeavyObjectがコピーされます。複製された各ArrayListオブジェクトには、まったく同じオブジェクトへの参照が含まれます。新しいHeavyObjectは作成されません。

追加する編集:これは、「浅い」コピーと「深い」コピーの違いです。ディープ コピーの場合は、それぞれのコピーHeavyObjectも作成されます。おっしゃる通り、メモリが爆発します。

于 2013-02-14T04:56:56.883 に答える
1

clone() メソッドは、Cloneable インターフェイスを実装するクラスのオブジェクトのコピーを作成するために使用されます。Object クラスは、オブジェクトがこのメソッドを呼び出す特定のクラスのメンバーについて事前に何も知らないため、デフォルトではフィールドごとのコピーを行います。そのため、クラスにプリミティブ データ型メンバーしかない場合、オブジェクトの完全に新しいコピーが作成され、新しいオブジェクト コピーへの参照が返されます。ただし、クラスに任意のクラス型のメンバーが含まれている場合、それらのメンバーへのオブジェクト参照のみがコピーされるため、元のオブジェクトと複製されたオブジェクトの両方のメンバー参照は同じオブジェクトを参照します。したがって、メモリが爆発することはありません。

于 2013-02-14T05:02:33.237 に答える
0

この声明では

ArrayList<Integer> copy = original;

あなたは参照を参照していますが、オブジェクトcopyも指していoriginalます。

参照によってオブジェクトを変更すると、オブジェクトcopyでも変更されoriginalます。

クローン:

clone() メソッドは同じオブジェクトの別のコピーを与えるので、オブジェクトを変更copyするとオブジェクトに反映されoriginalます。

于 2013-02-14T04:57:34.310 に答える