web-dev-qa-db-fra.com

Passer ArrayList en tant que paramètre

Permettez-moi de commencer par dire que je ne peux insérer aucun code ici car Internet sur mon ordinateur portable ne fonctionne pas, alors je le publie sur mon téléphone. Okay le problème est que disons que j'ai deux classes: les classes un et deux. La classe un a une ArrayList parmi ses attributs, elle appelle une méthode void de la classe deux et transmet cette ArrayList comme paramètre. Maintenant, cette méthode initialise une autre ArrayList et la rend égale au paramètre passé par moi et apporte des modifications à cette nouvelle ArrayList. La chose amusante est que même mon ArrayList original qui a été passé en paramètre change également. Quelle pourrait être la raison possible?

9
Sahil Chaudhary

Le problème est que lorsque vous utilisez = pour transformer le nouvel ArrayList en copie de l’original, vous créez simplement une nouvelle référence au même ArrayList. Voyez cela comme deux variables pointant sur le même objet.

Regardez ceci, cela pourrait vous aider à comprendre ce qui se passe: Java est-il un "passage par référence" ou un "passage par valeur"?

Afin de résoudre votre problème, vous devez créer un nouvel ArrayList en utilisant le mot-clé "nouveau" puis en ajoutant tous les objets, ou en utilisant la méthode clone ().

6
mauro.dec

La raison en est que lorsque vous passez un ArrayList en tant qu'argument, la méthode appelée peut modifier le contenu du tableau. La liste de tableaux contient des références à des objets . Si vous voulez éviter qu'une classe modifie le contenu de votre liste de tableaux, vous avez votre liste.

Utilisez object.clone () 

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

Rendez maintenant cette copie clonée. Mais assurez-vous que obj est clonable!

3
AlexWien

Exemple de code:

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
 }

}

Sortie:

[Steve, Daniel, John, Maxi, Jeni]

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

6

1
Stephen

L'opérateur = en Java copiera simplement la référence ArrayList (la même chose s'applique à tous les objets). Voir cette réponse pour créer une copie complète d’une ArrayList.

1
Chris Dargis

Parce qu'ils désignent la même référence. 

1
DarthVader

Cela est dû au fait que la nouvelle liste de tableaux pointe sur le même ancien tableau lorsque vous la rendez égale à.

Ce petit exemple devrait le clarifier.

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