2012-04-12 14 views
3

Ich habe diesen Code. Aber ich weiß nicht, wie das Ergebnis zu erklären:Referenz von zwei ArrayList auf die gleichen Objekte

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()); 

Das Ergebnis wird sein: 3/0/0

Das Problem, das ich nicht wissen, ist: wenn Sie first = second; so zuweisen, die beide zuerst und das zweite Array zeigt auf das gleiche Objekt (1,2 und 3). nach Ihnen clear alle Elemente auf dem zweiten Array, so alle die Verbindung zwischen dem zweiten Array und diese Objekte werden (kein Problem hier).

Die Sache, die ich nicht weiß, ist: aber diese Objekte (1,2 und 3) immer noch Bezug auf erste Array. Warum ist die erste Array-Größe 0.

Bitte erklären Sie mir.

Thanks :)

+0

Siehe diesen Link http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java – aProgrammer

Antwort

6

Durch second = first Zuordnung gibt es nur eine Arraylist mit zwei Referenzen. Die Referenzen sind gleich. Wenn der Anruf mit einer der beiden Referenzen (first oder second) gelöscht wird, wird die Löschung auf der referenzierten Arraylist durchgeführt.

Dies ist etwas anderes als Sie zuerst dachten. Es ist nicht so, dass die Zuweisung der second = first alle Referenzen der Strings, die Sie der ersten hinzugefügt haben, in ein neues ArrayList-Objekt kopiert wird, das magisch wäre (in Java).

1

aber diese Objekte (1,2 und 3) enthalten immer noch Bezug auf das erste Array. Warum Größe erster Array ist 0.

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

das gleiche ist

ArrayList<String> second = first; 

wie die Schreiben Sie haben zweiten Bezugspunkt auf die ersten Arraylist gemacht, ist es nicht eine neue Arraylist verwenden. Wenn Sie also clear aufrufen, wird die erste erstellte Arraylist gelöscht - Sie haben zwei Referenzen, die auf eine Arraylist verweisen.

3

Wenn Sie first = second tun, zeigen Ihre ArrayList-Elemente auf die gleichen Speicherorte. Doing a .clear entfernt die Elemente, auf die die ArrayList verweist. Dies hat Auswirkungen auf die andere ArrayList.

Wenn Sie nur die Elemente von ArrayList1 zu ArrayList2 kopieren möchten, können Sie so etwas wie dies tun: ArrayList<String> second = new ArrayList<String>(first);

1

Wenn Sie eine Arraylist zu zwei Variablen zuweisen und ändern einer von ihnen, diese in beide reflektieren. Die Operation, die in einer der Variablen ausgeführt wird, spiegelt sich auch in der zweiten wider. (Einzelnes Objekt, das von zwei Variablen referenziert wird).

1

In Java ist eine Variable (außer Primitiven) immer eine Referenz (die die Startadresse eines Objekts hat) nur für ein Objekt, Reference ist niemals ein Objekt an sich.

Zum Beispiel

Sekunde = zuerst;

weist eine Referenz zu, so dass die erste und die zweite jetzt auf das gleiche Objekt verweisen.Objekte werden nicht kopiert, weder in Zuweisungen, noch in Argumentübergabe (was kopiert/zugewiesen wird, ist die Referenz).

Verwandte Themen