2012-03-19 13 views
16

Bir ArrayList myArray ürünümüz var mı? Bir nesneyi işlevini çağırarak değiştirmek istiyorum. Bu şekilde yaparsam, orijinal nesne değişecek mi, olmayacak mı? ArrayListede bulunan nesneleri değiştirme ve düzeltme yapma

myArray.get(0).myModyfyingFunction(); 

Daha açık olarak - endişeliyim olsun() aslında benim asıl nesneye bir başvuru döndürür veya yalnızca kendi orijinal nesnenin bir kopyasını döndürmek olmazsa.

+7

Neden denemiyorsun .. – PrimosK

+2

Kontrol dışarı bu yazıyı ... Bu kod birkaç satır var :) /campfire/StoryPassBy.jsp (Bir kupa konseptindeki tüm kedinin uzaktan kumandası harika) –

+0

İyi nokta var @PrimosK :) Tahminleri duymak istedim, aynı zamanda Java'nın geçtiğini de okudum. sadece değer. –

cevap

51

get() nesne, asla bir kopyası başvuru dönecektir. Döndürülmüş referansta yaptığınız herhangi bir değişiklik, nesnenin kendisinde yapılacaktır.

+0

Teşekkür ederim, Java'daki nesnelerin her zaman değerden geçtiğini söyleyen bir sürü blog okudum ve bu yüzden kafam karıştı. –

+3

Bu doğru, tüm nesneler değere göre geçirilir. Kafa karıştırıcı kısım, _references_ öğesinin de değere göre geçirilmesidir - yani bir ArrayList öğesine bir nesne eklediğinizde, aynı nesneyi gösteren iki referansla sonuçlanırsınız ve bir referansı değiştirirseniz, "diğer" de değiştirilir Her ikisi de aynı nesneye işaret ettiğinden, –

+0

@ PrimožKralj: "nesneler" Java'daki değerler değildir. Nesneler asla geçilmez veya atanmaz. Referansları her zaman – newacct

1

Java hiçbir zaman nesnelerin kopyalarını döndürmez, yalnızca kopyaları nesnelerin başvurularında döndürür. Bu nedenle yöntem kesinlikle nesneyi 0 dizininde değiştirir.

Eğer yöntem bir tane oluşturuyorsa, bir nesnenin bir "kopyasını" alabilirsiniz, örn. Mümkünse return object.clone(); kullanarak, ancak aslında döndürülür, yöntemde hala oluşturulmuş kopyaya bir başvurudır. Böylece, bir nesnenin bir "kopyasını" daha geniş bir anlamda alabilirsiniz, ancak ArrayList#get(...) bunu yapmayacaktır - ve anlaşmaya göre, açıkça belirtilmemişse, alıcının bunu yapmaması gerekir.

+0

Teşekkür ederim, anlayışım şimdi daha iyi;) –

1

Bu, ArrayList öğesinde ne tür bir nesneye depolandığınıza bağlıdır. Örneğin, java.lang.String s ise, aramalar hiçbir şeyi değiştirmez. Nesneniz dizinindeki Aksi takdirde, evet değiştirecektir 0.

+0

Yöntemin uygulanması hakkında iyi bir nokta, ama bence bu durumda çağrıldıkları örneği değiştireceğini varsayabiliriz. üzerinde. :) – Thomas

+0

Teşekkürler, dizeler hakkında bunu bilmek güzel. –

+0

, ne tür bir nesneye bağlı değildir. Sadece yöntemin ne olduğuna bağlı. Dize sadece – newacct

1

Nesneye bir başvuru verir, böylece işleviniz herhangi bir değişiklik yapmazsa, nesneniz değiştirilir. Aynı

Bunu ne olur: ArrayList'deki herhangi bir nesne saklıyorsanız

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) değerine göre tahsis edip geçiriyorsunuz;' eğer aynı nesne değil, sadece mantıksal olarak eşitse (eğer uygulamaya bağlıysa) eşittir() '). – Thomas

+0

iyi bir gözlem, cevabın, nesnenin değiştirildiğini açıklamak için değiştirdim ve eklenen (ve aynı zamanda mantıksal olarak eşittir) aynı referanstır. –

+0

Açıklamalarınız ve sağladığınız örnek için teşekkür ederiz. –

7

, Nesne çoğaltılır ve nesne herhangi bir değişiklik nesnenin kendisinde yansıtmalıdır. örneğin

herhangi bir diğer sınıf çıktısı verir after1

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

ana yöntemde sınıf 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; 
} 

}

burada

bir kod sahiptir. http://www.javaranch.com:

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

} 
İlgili konular