2013-07-23 12 views
7

z 2 ArrayList, zastanawiałem się, czy najlepszym sposobem z przekształcenia 1. Jeden w „kopia” z drugim jest iść jakNajlepszy sposób przekazać wartość z ArrayList do innej

myFirstArray.clear(); 
myFirstArray.addAll(mySecondArray); 

lub

myFirstArray = mySecondArray.clone(); 

Jakie są główne różnice między tymi dwiema metodami, która jest preferowana i czy istnieje inne "łatwiejsze" lub "czystsze" rozwiązanie. Dziękuję za wszelkie wskazówki:

EDYCJA: Używam tej kopii do zamiany szyku elementu, aktualnie pracuję z tym, w którym przechowuję przedmiot, nad którym będę pracował w następnej pętli. Na końcu pętli zastępuję moją currentArrayList moją futurArrayList i wyczyszczę moją futurArraylistę, aby dodać do niej nowy element (mam nadzieję, że jest wystarczająco jasny).

+0

Należy zachować ostrożność, jeśli na liście znajduje się grupa typów referencyjnych, które mogą zawierać listy wskazujące ten sam obiekt. –

+2

Po prostu komentarz w stylu: zazwyczaj nazwy zmiennych powinny zaczynać się od małej litery. Nie tylko dla osób czytających kod, ale także podświetlanie składni stackoverflow zostaje zdezorientowane! –

+0

Jaki jest cel twojej kopii? Wiedząc, co chcesz zrobić, pomożesz nam uzyskać najlepszą odpowiedź. –

Odpowiedz

12

Pierwszy z nich zastępuje zawartość listy inną treścią. Drugi tworzy kolejną instancję ArrayList, pozostawiając poprzednią nietkniętą.

Jeśli do listy odwołuje się inny obiekt, a chcesz, aby ten inny obiekt był nietknięty, użyj drugiego. Jeśli chcesz, aby inny obiekt miał również nową zawartość, użyj pierwszego.

Jeśli nic nie wskazuje tej listy, nie ma to większego znaczenia. Drugi zmniejszy ilość pamięci użytej w przypadku zastąpienia zawartości dużej listy kilkoma elementami.

+0

Dzięki za precyzję, mój Arraylist rzeczywiście odwołuje się do innego obiektu, więc addAll jest preferowany. – WizLiz

1

Używaj:

List<Object> first = ... 
ArrayList<Object> second = new ArrayList<>(first); 

Proponuję także, aby nie używać clone() w ogóle. Lepiej jest użyć konstruktora kopii lub innej metody fabrycznej. Spójrz na here.

Oczywiście w twoim przypadku, z ArrayList, będzie działać zgodnie z oczekiwaniami, otrzymasz kopię referencji.

+0

Nie chcę kopii referencyjnej. Chcę utworzyć nową listę i edytować ją. jak mogę to zrobić? –

+0

Jeśli chcesz utworzyć głęboką kopię listy, musisz utworzyć kopię dla każdego obiektu na liście. Sugeruję utworzenie konstruktora kopiowania dla twoich obiektów, a następnie tylko iterowanie starego i zapełnianie nowego. –

1

W języku java, chociaż klon jest "przeznaczony" do tworzenia kopii tego samego obiektu, nie jest gwarantowany. Klon przychodzi z dużą ilością jego i butów. Tak więc moją pierwszą radą jest nie poleganie na klonach.

Domyślnie klonowanie java jest "kopiowaniem pól po polu", tj. Ponieważ klasa Object nie ma pojęcia o strukturze klasy, w której zostanie wywołana metoda clone(). Więc JVM Wywołany do klonowania, czy następujące rzeczy:

  1. Jeśli klasa ma tylko prymitywne członków typów danych, a następnie zostanie utworzona całkowicie nowa kopia obiektu oraz odniesienie do nowego obiektu kopia Być zwracane.

  2. Jeśli klasa zawiera elementy dowolnego typu klasy to tylko obiektu odniesienia do tych członków są kopiowane i stąd człon odniesienia zarówno oryginalnego obiektu, jak sklonowanego obiektu odnoszą się do tego samego obiektu z powodu że sklonowane zmiany obiektu są widoczne również w oryginale.

+0

W moim przypadku, kopiowanie tylko odsyłacza nie jest prawdziwym problemem, ponieważ zamierzam zmodyfikować ten obiekt, tak aby to samo odniesienie było korzystne. Ale dzięki za dokładność – WizLiz

0

Guawa, guawa, guawa!

final List copied = ImmutableList.copyOf(originalList); 
Powiązane problemy