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.
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.
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.
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.
Cela dépend du type d'objet que vous avez stocké dans votre ArrayList. Par exemple, s’il s’agit de Java.lang.String
s, les appels ne modifieront rien ..__ sinon, oui, il modifiera votre objet stocké à l’indice 0.
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
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;
}
}
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());
}