2015-10-21 12 views
5

Widzę pewne zachowanie, którego nie jestem w stanie zrozumieć i zastanawiałem się, czy ktoś byłby na tyle uprzejmy, aby wyjaśnić dokładnie, co się tutaj dzieje. To jest kod, który mam obecnie.Dlaczego usuwam element z niewłaściwej tablicy ArrayList?

public class MyClass { 

    ArrayList<String> myList = new ArrayList<String>(); 

    public MyClass() { 
     populate(); 
     removeData(myList); 
    } 

    private void populate() { 
     myList.add("Some data"); 
     myList.add("Some more data"); 
     myList.add("Even more data"); 
    } 

    private void removeData(ArrayList<String> list) { 
     ArrayList<String> temp = new ArrayList<String>(); 
     temp = list; 
     temp.remove("Some data"); 
    } 
} 

Teraz z jakiegoś powodu po uruchomieniu tego kodu dane są usuwane z ArrayList "myList". Dlaczego tak się dzieje, mimo że mam tylko usuwać dane ze zmiennej wewnątrz metody "removeData", a nie z pola "myList"?

+1

ale przypisane 'temp = list' więc w zasadzie odniesienia są skierowane do tego samego obiektu – ochi

+0

Java przypisać obiekt referencje, musisz przeczytać więcej o podstawach programowania Java i Object Oriented –

+0

Ponieważ templist = mylist przypisuje odnośnik do mylist do templist.so cokolwiek robisz na templistzie wpłynie na moją listę. –

Odpowiedz

6
temp = list; 

Mimo że usuwasz wewnątrz metody, wciąż wskazuje na członka instancji, dlatego może zobaczyć zmiany.

Musisz utworzyć nową listę z tymi wartościami, jeśli nie chcesz wpływać na element instancji.

3

Zmień swój kod do:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); 
    temp.remove("Some data"); 
} 

a otrzymasz żądane zachowanie (choć tak naprawdę nie ma większego sensu). Przypisywanie list do temp nie powoduje kopiowania elementów na liście, ale przypisuje tylko odniesienie do tego samego obszaru pamięci.

1

Java działa z referencjami, więc po przypisaniu temp = list obie zmienne wskazywały ten sam obiekt. Zamiast tego, chcesz zrobić kopię list:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); // Make a copy 
    temp.remove("Some data"); 
} 
1
ArrayList<String> temp = new ArrayList<String>(); 
    temp = list; 

W pierwszym wierszu podczas tworzenia nowej listy. Do tego momentu jest w porządku. Ale w następnej linii masz na myśli list do temp. Więc wcześniej obiekt, do którego odnosił temp śmieci będą zbierane temp będą odnosząc się do tego samego obiektu, który został stworzony Myclass konstruktor