2016-04-03 25 views
1

en Öyle gibi listemi initialize diyelim:Neden Kapsam dışı bir yöntemde bir Listeyi neden değiştirmeden değiştirebiliyorum?

public static void main(String[] args) { 
    ArrayList<String> a = new ArrayList<String>(); 
    a.add("one"); 
    a.add("two"); 
    a.add("three"); 
    a.add("four"); 
    modifyList(a); 
} 
modifyList basitçe her değeri değişir

"tek" şöyle:

private static void modifyList(ArrayList<String> a) { 
    for (int i = 0; i < a.size(); i++) { 
     a.set(i, "one"); 
    } 
} 

ben bu yöntemi çağırmadan önce ve sonra listesini yazdırmak olursa Aynı orijinal listenin iki kez görünmesini beklerim. Ancak bazı nedenlerle, modifyList'da değiştirilen ArrayList, main'daki ArrayList ile aynıdır.

Aynı deneyi Ints ve Strings yerine Listeler yerine, yapmazsanız değiştirilir.

Nedenini açıklayabilir mi?

cevap

4

Java'da, parametreler değere göre geçirilir. Ancak, ArrayList öğenize bir başvuruyu yöntemine ilettiniz (ve başvurunun kendisi değere göre geçirilir) ve bu nedenle yöntem orijinal listeyi değiştirmiş olursunuz.

Bunun gerçekleşmemesini sağlamak istiyorsanız, parametre olarak değişmez bir listeyi iletmeniz gerekir.

+0

Eğer durum böyleyse, ints ve string kullandığımda, bir Tamsayı/String nesnesinin referansını değer yerine bir yönteme aktarmıyorum (aynı şekilde değerlerin yerine ArrayList referansını iletiyorum) ? –

+0

Beklediğiniz gibi davranmayan denemelerin kodunu göstermelisiniz. Tamsayılar ve Tamsayılar arasında bir fark var, ona inanın ya da inanmayın (aslında ints ve Integers), ve açıklamanızdan kesin olarak ne yaptığınızı söyleyemeyiz. – arcy

+0

Java temel öğeleri (int, float, bayt, char vb.) Ve Java nesneleri arasında (bir ilkel olarak ele alınan bir nesne olan String haricinde) bir fark vardır. Primitifler, değer ile geçirilir ve değişmezdir. İlkelleri değiştirmeyi denediğinizde, orijinal olanın yerine yeni bir değer yaratılır. Ancak nesneler, orijinal objeye atıfta bulunarak geçirilir, bu nedenle, üzerinde yapılan tüm değişiklikler orijinal değeri etkiler. – mmaarouf

İlgili konular