2012-03-19 1 views
16

Disons que nous avons une 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 changé ou non?ArrayList et la modification des objets inclus

myArray.get(0).myModyfyingFunction(); 

Pour clarifier davantage - Je suis inquiet si get() retourne en fait une référence à mon objet original ou est-ce que retourne une copie de mon objet original.

+7

Pourquoi essayez-vous pas sur .. :) Il est quelques lignes de code ... – PrimosK

+2

Vérifiez cet article: http://www.javaranch.com /campfire/StoryPassBy.jsp (La télécommande entière de chat dans un concept de tasse est génial) –

+0

Bon point là @PrimosK :) Je suppose que je voulais entendre les explications aussi bien que j'ai lu que Java est pass-by- valeur seulement. –

Répondre

51

get() retournera une référence à l'objet, jamais une copie. Toute modification que vous faites sur la référence retournée sera faite sur l'objet lui-même

+0

Je vous remercie, j'ai lu beaucoup de blogs où il est dit que les objets en Java sont toujours passés par la valeur et c'est pourquoi je suis confus. –

+3

C'est vrai, tous les objets sont passés en valeur. La partie confuse est que _references_ est également passé par valeur - ce qui signifie que lorsque vous ajoutez un objet à une ArrayList, vous obtenez deux références pointant vers le même objet, et si vous modifiez une référence, l'autre sera également modifié , parce que les deux pointent vers le même objet –

+0

@ PrimožKralj: "objets" ne sont pas des valeurs en Java. Les objets ne sont jamais passés ou attribués. Vous attribuez et transmettez des références, toujours par la valeur – newacct

1

Java ne renvoie jamais de copies d'objets, seulement des copies aux références d'objets. Ainsi, la méthode changerait définitivement l'objet à l'index 0.

Vous pourriez obtenir une "copie" d'un objet si la méthode en créait une, par ex. en utilisant return object.clone(); si possible, mais en réalité renvoyé est une référence à la copie qui a été encore 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, ni getter ne devrait le faire, sauf indication contraire.

+0

Merci, ma compréhension est maintenant meilleure;) –

1

Cela dépend du type d'objet que vous avez stocké dans votre ArrayList. Par exemple, s'ils sont java.lang.String s, les appels ne modifieront rien. Sinon, oui, il va modifier votre objet stocké à l'index 0.

+0

Bon point sur l'implémentation de la méthode, mais je pense que dans ce cas on peut supposer qu'elle va réellement modifier l'instance qu'elle s'appelait sur. :) – Thomas

+0

Merci, bon à savoir à propos des cordes. –

+0

cela ne dépend pas du type d'objet. Cela dépend simplement de ce que fait la méthode. La chaîne arrive à ne pas avoir de méthodes qui la muent – newacct

1

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

même 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 
+0

'myArray.get (0) .equals (obj);' pourrait même renvoyer vrai si 'obj' n'était pas la même instance mais seulement logiquement égal (dépend de l'implémentation de' est égal à() '). – Thomas

+0

bonne observation, j'ai modifié ma réponse pour préciser que l'objet a été modifié et c'est la même référence que l'ajouté (et c'est aussi logiquement égal). –

+0

Merci pour votre explication et fourni un exemple. –

7

Si vous stockez un objet dans ArrayList, objet n'est pas répliqué et tout changement dans l'objet devrait refléter dans 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; 
} 

}

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

Affichera après1.

0
Here is an barebone example. Modify an object of Test class in the List. 

    public class ModifyArrayList{ 


    public static void main(String [] args){  
      List<Test> l = new ArrayList<Test>(); 
    Test t1 = gettest(); 
    t1.setStr("John"); 
    t1.setInte(100); 
    t1.setAno("Smith"); 
    l.add(t1); 
    t1 = new Test(); 
    t1.setStr("Tracy"); 
    t1.setInte(100); 
    t1.setAno("Pinto"); 
    l.add(t1); 
    t1 = new Test(); 
    t1.setStr("Ryan"); 
    t1.setInte(100); 
    t1.setAno("SmithPinto"); 
    l.add(t1); 
    t1 = new Test(); 
    t1.setStr("Someone"); 
    t1.setInte(100); 
    t1.setAno("Else"); 
    l.add(t1); 



    ListIterator<Test> ti = l.listIterator(); 

    while(ti.hasNext()) 
    { 
     Test t = ti.next(); 
     if(t.getAno().equals("SmithPinto")) 
     { 
      t.setInte(200); 
         } 
     //ti.set(t); 
     ti.remove(); 
     ti.add(t); 
    } 
      for (Test t:l) 
    { 
     System.out.println("TEST: " + t.getInte()); 
    } 
      } 
    } 


    //Test Class below: 

    public class Test { 

    private String str; 
    private int inte; 
     public String getStr() { 
    return str; 
     } 
       public void setStr(String str) { 
        this.str = str; 
            } 
public int getInte() { 
    return inte; 
} 
public void setInte(int inte) { 
    this.inte = inte; 
} 
public String getAno() { 
    return ano; 
} 
public void setAno(String ano) { 
    this.ano = ano; 
} 
private String ano; 

}

0
for(User user: Users){ 

user.setName(user.getName() + " New Name"); 

} 

for(User user: Users){ 

System.out.println(user.getName()); 

} 
Questions connexes