web-dev-qa-db-fra.com

ArrayList et modification des objets qu'il contient

Disons que nous avons un ArrayList myArray. Je veux modifier un objet en appelant sa fonction. Si je le fais de cette façon, l'objet original sera-t-il modifié ou non?

myArray.get(0).myModyfyingFunction();

Pour clarifier davantage - je suis préoccupé par le fait que get () renvoie effectivement une référence à mon objet d'origine ou renvoie uniquement une copie de mon objet d'origine.

21
Primož Kralj

get() renverra une référence à l'objet, jamais une copie. Toute modification apportée à la référence renvoyée sera effectuée sur l'objet lui-même.

56
Óscar López

Si vous stockez un objet dans ArrayList, Object n'est pas répliqué et toute modification d'objet doit refléter l'objet lui-même.

par exemple nous avons la classe NewClass 

  public class NewClass {

private String mystring="";

/**
 * @return the mystring
 */
public String getMystring() {
    return mystring;
}

/**
 * @param mystring the mystring to set
 */
public void setMystring(String mystring) {
    this.mystring = mystring;
}

}

voici le code dans la méthode principale de toute autre classe 

   List<NewClass> newclasses = new ArrayList<NewClass>();
    NewClass class1 = new NewClass();
    class1.setMystring("before1");
    NewClass class2 = new NewClass();
    class2.setMystring("before2");
    newclasses.add(class1);
newclasses.add(class2);
newclasses.get(0).setMystring("after1");
System.out.println(class1.getMystring());

Cela va sortir après1.

7
kundan bora

Java ne renvoie jamais de copies d'objets, mais uniquement des copies de références d'objets. Ainsi, la méthode changerait définitivement l’objet à l’indice 0.

Vous pouvez obtenir une "copie" d'un objet si la méthode en crée une, par exemple. en utilisant return object.clone(); si possible, mais ce qui est en fait retourné est une référence à la copie qui a toujours été créée dans la méthode. Vous pouvez donc obtenir une "copie" d'un objet dans un sens plus large, mais ArrayList#get(...) ne le fera pas - et par convention, aucun des deux ne devrait le faire, à moins d'indication explicite.

1
Thomas

Cela dépend du type d'objet que vous avez stocké dans votre ArrayList. Par exemple, s’il s’agit de Java.lang.Strings, les appels ne modifieront rien ..__ sinon, oui, il modifiera votre objet stocké à l’indice 0.

1
ring bearer

Il vous donne une référence à l'objet, donc si votre fonction effectue une modification dans son état, votre objet sera modifié.

La même chose se produit lorsque vous faites ceci:

ArrayList myArray = new ArrayList();
MyObject obj = new MyObject();
myArray.add(obj);
obj.myModifyingFunction();
myArray.get(0).equals(obj); // returns true
myArray.get(0) == obj; // returns true as well
1
Alonso Dominguez

Voici un exemple. Modifier un objet de la classe Test dans la liste.

public class ModifyArrayList {

    public static void main (String [] args) {

        List<Test> tests = new ArrayList<Test>();

        Test firstTest = new Test();
        firstTest.setId(100);
        firstTest.setName("John");
        tests.add(firstTest);

        Test secondTest = new Test();
        secondTest.setId(101);
        secondTest.setName("Tracy");
        tests.add(secondTest);

        Test thirdTest = new Test();
        thirdTest.setId(102);
        thirdTest.setName("Ryan");
        tests.add(thirdTest);

        ListIterator<Test> testIterator = tests.listIterator();
        while(testIterator.hasNext()) {

            Test test = testIterator.next();
            if (test.getName().equals("Ryan")) {
                test.setId(300);
            }

            testIterator.remove();
            testIterator.add(test);
        }

        for (Test test : tests) {
            System.out.println("Test #" + test.getId() + " name=" + test.getName());
        }

    }
}

Test.Java

class Test {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
0
Steer360

Mettre à jour les objets dans la liste:

for (User user: Users) {
    user.setName( user.getName() + " New Name");
}

Afficher les objets mis à jour

for (User user: Users) {    
    System.out.println( user.getName());
}
0
Dunno Dunno