2012-03-19 9 views
16

Supponiamo di avere un array myArray. Voglio modificare un oggetto chiamando la sua funzione. Se lo faccio in questo modo, l'oggetto originale sarà cambiato o no?ArrayList e modifica degli oggetti inclusi in esso

myArray.get(0).myModyfyingFunction(); 

per chiarire ulteriormente - Sono preoccupato se get() restituisce in realtà un riferimento al mio oggetto originale o lo fa restituire solo una copia del mio dell'oggetto originale.

+7

Perché non provarlo .. :) E 'un paio di righe di codice ... – PrimosK

+2

leggi questo articolo: http://www.javaranch.com /campfire/StoryPassBy.jsp (Il telecomando di tutto il gatto in un concetto di tazza è fantastico) –

+0

Buon punto lì @PrimosK :) Immagino di voler ascoltare le spiegazioni e ho letto che Java è pass-by- solo valore. –

risposta

51

get() restituirà un riferimento all'oggetto, mai una copia. Qualsiasi modifica effettuata sul riferimento restituito sarà effettuata sull'oggetto stesso

+0

Grazie, ho letto un sacco di blog in cui si dice che gli oggetti in Java sono sempre passati per valore ed è per questo che sono confuso. –

+3

È vero, tutti gli oggetti vengono passati per valore. La parte confusa è che anche _references_ viene passato per valore - il che significa che quando aggiungi un oggetto ad ArrayList ti ritroverai con due riferimenti che puntano allo stesso oggetto, e se modifichi un riferimento, anche l'"altro" verrà modificato , perché entrambi puntano allo stesso oggetto –

+0

@ PrimožKralj: "oggetti" non sono valori in Java. Gli oggetti non vengono mai passati o assegnati. Assegnate e passate referenze, sempre per valore – newacct

1

Java non restituisce mai copie di oggetti, solo copie di riferimenti di oggetti. Quindi il metodo cambierebbe sicuramente l'oggetto nell'indice 0.

Si potrebbe ottenere una "copia" di un oggetto se il metodo ne creerebbe uno, ad es. utilizzando return object.clone(); se possibile, ma ciò che è in realtà restituito è un riferimento alla copia che è stata ancora creata nel metodo. Quindi potresti ottenere una "copia" di un oggetto in un senso più ampio, ma lo ArrayList#get(...) non lo farà, e per convenzione nessuno dei due dovrebbe farlo se non esplicitamente dichiarato.

+0

Grazie, la mia comprensione ora è migliore;) –

1

Dipende dal tipo di oggetto archiviato in ArrayList. Ad esempio, se sono java.lang.String s, le chiamate non modificheranno nulla. In caso contrario, si modifica l'oggetto memorizzato nell'indice 0.

+0

Buon punto sull'implementazione del metodo, ma penso che in questo caso si possa presumere che modificherà effettivamente l'istanza in cui è stato chiamato sopra. :) – Thomas

+0

Grazie, bello sapere questo sugli archi. –

+0

non dipende dal tipo di oggetto. Dipende solo da cosa fa il metodo. String semplicemente non ha alcun metodo che lo muta – newacct

1

Fornisce un riferimento all'oggetto, pertanto se la propria funzione esegue qualsiasi modifica nel suo stato, l'oggetto verrà modificato.

stesso accade quando si esegue questa operazione:

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);' potrebbe effettivamente restituire true se 'obj' non era la stessa istanza ma solo logicamente uguale (dipende dall'implementazione di' equals() '). – Thomas

+0

buona osservazione, ho modificato la mia risposta per chiarire che l'oggetto è stato modificato ed è lo stesso riferimento a quello aggiunto (ed è anche logicamente uguale). –

+0

Grazie per la spiegazione e l'esempio fornito. –

7

Se si memorizza qualsiasi oggetto ArrayList, oggetto non viene replicato e qualsiasi cambiamento in oggetto dovrebbe riflettere in oggetto stesso.

per esempio abbiamo 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; 
} 

}

qui è codice nel metodo principale di qualsiasi altra 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()); 

Questo stamperà dopo 1.

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

} 
Problemi correlati