webentwicklung-frage-antwort-db.com.de

ArrayList als Parameter übergeben

Lassen Sie mich zunächst sagen, dass ich hier keinen Code eingeben kann, da das Internet auf meinem Laptop nicht funktioniert. Ich poste dies über mein Handy. Okay, das Problem ist, dass ich zwei Klassen habe: Klasse eins und zwei. Klasse eins hat eine ArrayList als eines ihrer Attribute und ruft eine void-Methode aus Klasse zwei auf und übergibt diese ArrayList als Parameter. Nun initialisiert diese Methode eine andere ArrayList und macht sie mit dem von mir übergebenen Parameter gleich und nimmt Änderungen an dieser neuen ArrayList vor. Komisch ist, dass sich auch meine ursprüngliche ArrayList ändert, die als Parameter übergeben wurde. Was könnte der mögliche Grund sein?

9
Sahil Chaudhary

Das Problem ist, dass wenn Sie = verwenden, um die neue ArrayList zu einer Kopie des Originals zu machen, Sie lediglich einen neuen Verweis auf dieselbe ArrayList erstellen. Stellen Sie sich zwei Variablen vor, die auf dasselbe Objekt zeigen.

Schauen Sie sich das an, es könnte Ihnen helfen zu verstehen, was passiert: Ist Java "Referenzübergabe" oder "Wertübergabe"?

Um Ihr Problem zu lösen, müssen Sie eine neue ArrayList erstellen, indem Sie das Schlüsselwort "new" verwenden und dann alle Objekte hinzufügen oder die clone () -Methode verwenden.

6
mauro.dec

Der Grund ist, dass, wenn Sie eine ArrayList als Argument übergeben, die aufgerufene Methode den Inhalt des Arrays ändern kann. Die ArrayList enthält Verweise auf Objekte . Wenn Sie vermeiden möchten, dass eine Klasse den Inhalt Ihrer ArrayList ändert, ___. Sie eine Kopie Ihrer ArrayList zurückgeben, in der sich alle darin enthaltenen Objekte in Klonen befinden deine Liste.

Object.clone () verwenden 

ArrayList clonedCopy = new ArrayList(list1.size());
for (Object obj : list1) {
  clonedCopy.add(obj.clone());
}

Jetzt gib diese geklonte Kopie zurück. Aber stellen Sie sicher, dass obj klonbar ist!

3
AlexWien

Beispielcode:

public class MethodArguments {

public static void main(String args[]) {

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

    a.add("Steve");

    a.add("Daniel");
    a.add("John");
    a.add("Maxi");
    a.add("Jeni");

    System.out.println(a);

    display(a);

    getSize(a);

}

static void display(ArrayList<String> arrayList1) {

    arrayList1.add("Pollard");

    System.out.println(arrayList1); // passing the arraylist values and
                                    // adding the element

}

static void getSize(ArrayList<String> arrayList1) {

    System.out.println(arrayList1.size()); // getting the size of arraylist
                                            // by passing arguments to
                                            // method
 }

}

Ausgabe:

[Steve, Daniel, John, Maxi, Jeni]

[Steve, Daniel, John, Maxi, Jeni, Pollard]

6

1
Stephen

Der =-Operator in Java kopiert einfach die ArrayList-Referenz (das gleiche gilt für alle Objekte). Siehe diese Antwort , um eine tiefe Kopie einer ArrayList zu erstellen.

1
Chris Dargis

Weil sie auf dieselbe Referenz verweisen. 

1
DarthVader

Dies liegt daran, dass die neue Array-Liste auf dasselbe alte Array verweist, wenn Sie es gleich machen.

Dieses kleine Beispiel sollte es klarstellen.

import Java.util.ArrayList;
import Java.util.List;


public class JavaApplication1 {


    public static void main(String[] args) {

        List <String> origList = new ArrayList<>();
        origList.add("a");
        origList.add("b");

        JavaApplication1 app = new JavaApplication1();
        app.addToList(origList);

        for(String str:origList){            
            System.out.println(str);
        }

    }

    private void addToList(List<String> strList){
        System.out.println("inside addToList");
        List <String> newList = new ArrayList<>();
        // newList = strList; //This is how you are doing it
        newList.addAll(strList); //This is how you should do it.

        newList.add("x");
    }
}
0
PCM