2015-10-21 10 views
5

Ich sehe ein Verhalten, das ich nicht ganz nachvollziehen kann und fragte mich, ob jemand so freundlich wäre, genau zu erklären, was hier vor sich geht. Dies ist der Code, den ich derzeit habe.Warum entferne ich ein Element aus der falschen ArrayList?

public class MyClass { 

    ArrayList<String> myList = new ArrayList<String>(); 

    public MyClass() { 
     populate(); 
     removeData(myList); 
    } 

    private void populate() { 
     myList.add("Some data"); 
     myList.add("Some more data"); 
     myList.add("Even more data"); 
    } 

    private void removeData(ArrayList<String> list) { 
     ArrayList<String> temp = new ArrayList<String>(); 
     temp = list; 
     temp.remove("Some data"); 
    } 
} 

Jetzt aus irgendeinem Grunde, nachdem ich diesen Code ausführen, werden Daten aus dem Arraylist „myList“ entfernt. Warum passiert das, obwohl ich nur Daten aus einer Variablen innerhalb der Methode "removeData" und nicht aus dem Feld "myList" entfernen soll?

+1

aber sie zugewiesen 'temp = list' so dass im Grunde die Referenzen verweisen auf das gleiche Objekt erstellt wurde – ochi

+0

Java zuzuweisen Objekt Referenzen, müssen Sie mehr über Java und Objektorientierte Programmierung Grundlagen lesen –

+0

Weil templist = mylist ist die Zuordnung der Referenz von mylist zu templist.so was auch immer Sie auf templist tun wird meine Liste auswirken. –

Antwort

6
temp = list; 

Auch wenn Sie innerhalb der Methode entfernen, Sie weisen nach wie vor auf ein Instanzenmitglied, daher kann er die Änderungen sehen.

Sie müssen eine neue Liste mit diesen Werten erstellen, wenn Sie das Instanzmitglied nicht beeinflussen möchten.

3

Ihren Code ändern:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); 
    temp.remove("Some data"); 
} 

und Sie werden Ihre gewünschte Verhalten bekommen (obwohl sie nicht wirklich viel Sinn machen). Das Zuweisen von list zu temp kopiert die Elemente in der Liste nicht, sondern weist nur einen Verweis auf den gleichen Speicherbereich zu.

1

Java arbeitet mit Referenzen. Wenn Sie also temp = list zugewiesen haben, zeigen beide Variablen auf dasselbe Objekt. Stattdessen möchten Sie eine Kopie von list machen:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); // Make a copy 
    temp.remove("Some data"); 
} 
1
ArrayList<String> temp = new ArrayList<String>(); 
    temp = list; 

In der ersten Zeile, die Sie neue Liste erstellen. Bis zu diesem Punkt ist es in Ordnung. Aber in der nächsten Zeile beziehen Sie sich list auf temp. So früher Objekt, auf die temp bezogen wird Müll temp gesammelt wird auf das gleiche Objekt mit Bezug der Myclass Konstruktor

Verwandte Themen