2012-04-12 8 views
3

私はこのコードを持っています。しかし、私は結果を説明するのか分からない:同じオブジェクトへの2つのarrayListの参照

ArrayList<String> first = new ArrayList<String>(); 
     first.add("1"); 
     first.add("2"); 
     first.add("3"); 

     ArrayList<String> second = new ArrayList<String>(); 
     second = first; 
     System.out.println("before modified:"+second.size()); 
     second.clear(); 
     System.out.println("after modified:"); 
     System.out.println(" First:"+first.size()); 
     System.out.println(" Second:"+second.size()); 

結果は以下のようになります。3/0/0

私にはわからない問題がある:あなたがそうfirst = second;を割り当てるときに、両方の最初の2番目の配列は同じオブジェクト(1,2,3)を指します。後でclearの2番目の配列のすべての要素は、2番目の配列とこれらのオブジェクトの間のすべての参照が緩んでいます(ここでは問題ありません)。

私には分かりませんが、これらのオブジェクト(1,2,3)はまだ最初の配列を参照しています。最初の配列のサイズが0である理由

私に説明してください。 second = firstを割り当てることにより

+0

このリンクを参照してください。http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java – aProgrammer

答えて

6

:)

おかげで、2つの参照を持つ唯一のArrayListがあります。参照は同じです。したがって、2つの参照(firstまたはsecond)のいずれかを使用してコールをクリアすると、参照されたarraylistに対してクリアが実行されます。

これはあなたが最初に考えた以外のものです。 second = firstに追加した文字列のすべての参照を最初の文字列に割り当てることは、新しいArrayListオブジェクトにコピーされます(Javaの場合はマジックになります)。

1

でも、これらのオブジェクト(1,2,3)はまだ第1の配列を参照しています。 最初の配列のサイズが0

ArrayList<String> second = new ArrayList<String>(); 
second = first; 

ですなぜあなたはそれが新しいのArrayListを使用していない、最初にArrayListに第二の基準点を作った

ArrayList<String> second = first; 

を書くことと同じです。だからあなたが明確に呼んだとき、 "最初の" arraylistが作成したものをクリアします - あなたはarraylistを指す2つの参照を持っています。

3

first = secondを実行すると、ArrayListアイテムは同じメモリ位置を指します。 .clearを実行すると、ArrayListが指している要素が削除されます。これは他のArrayListに影響を与えます。

あなただけArrayList2ArrayList1の要素をコピーしたい場合は、そのような何か行うことができます:あなたは2つの変数に1つのArrayListを割り当て、それらのいずれかを変更するとArrayList<String> second = new ArrayList<String>(first);

1

、これは両方に反映されます。したがって、いずれかの変数で実行される操作も、2番目の変数に反映されます。 (2つの変数によって参照される単一のオブジェクト)。

1

Javaでは、変数(プリミティブを除く)は常にオブジェクトへの参照(オブジェクトの開始アドレスを持ちます)ですが、参照はそれ自体では決してオブジェクトではありません。例えば

第=最初;

が参照を割り当てているため、1番目と2番目が同じオブジェクトを参照しています。オブジェクトはコピーされず、代入も引数渡しもされません(コピー/割り当ては参照です)。

関連する問題