Potrzebuję płytkiej kopii java ArrayList
, czy powinienem użyć clone()
lub powtórzyć iterację nad oryginalną listą i skopiować elementy do nowej tablicy array, która jest szybsza?ArrayList płytka kopia iterate lub klon()
Odpowiedz
Zastosowanie clone()
lub użyj copy-konstruktor.
Konstruktor kopii dokonuje dodatkowej transformacji z przekazanego zbioru do tablicy, podczas gdy metoda clone()
bezpośrednio korzysta z tablicy wewnętrznej.
Należy pamiętać, że clone()
zwraca Object
, więc musisz odrzucić do List
.
Dokładnie przyjrzałem się kodowi źródłowemu java.util.ArrayList i odkryłem, że klon() używa Array.copyof, który byłby znacznie bardziej wydajny niż pętla nad oryginałem ArrayList. public Object clone() {try { @SuppressWarnings ("niesprawdzone") ArrayList
Nie martwię się zbytnio o wydajność. Używanie clone() to ból; po prostu użyj konstruktora konwersji zgodnie z sugestią. –
@ Kevin Bourrillion dlaczego myślisz, że używając 'clone()' jest ból? Wdrożenie 'clone()' oznacza ból, a nie używanie go. – Bozho
Nie trzeba iteracyjne:
List original = ...
List shallowCopy = new ArrayList(original);
http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29
Zamiast powtarzać ręcznie, można użyć copy constructor.
Co do różnicy prędkości pomiędzy tym i korzystania clone()
:
- Nieważne
- Najprawdopodobniej istnieje żaden
- Czy punkt odniesienia dla konkretnej konfiguracji systemu i użyj sprawę
@ Michael..Thanks. Sprawdziłem kod dla konstruktora kopii. Ma dodatkowy krok do zwrócenia kopii wewnętrznej struktury tablicowej, o czym wspomniał Bozho. publiczny ArrayList (Collection extends E> c) { elementData = c.toArray(); size = elementData.length; if (elementData.getClass()! = Object []. Class) elementData = Arrays.copyOf (elementData, size, Object []. Class); } – tech20nn
Podoba mi się uniwersalny "powinienem zoptymalizować?" wzór myślowy –
pytanie mówi shallowcopy nie deepcopy.Copying bezpośrednie odwołanie z jednego odniesienia do listy arraylist do innego będzie również działać right.Deep kopii zawiera kopię indywidualnych element w tablicy listy.
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(3);
ArrayList<Integer> list1=list; //shallow copy...
Czy jest jakiś problem?
To jest złe. Wszystko to sprawi, że w pamięci będą znajdować się dwa wskaźniki do jednego fizycznego obiektu 'ArrayList'. Dodanie 'Integer' do jednej listy powoduje, że' Integer' pojawia się również na drugiej liście. Nie tego chcemy. Płytka kopia powoduje, że obiekty leżące pod nią dzielą tę samą przestrzeń pamięci, ale listy mają oddzielne miejsce w pamięci. Więc jeśli zmodyfikujesz jedną "Integer", zostanie ona zmodyfikowana na obu listach. Ale jeśli dodasz "Integer" do jednej listy, nie pojawi się ona w drugiej. Głęboka kopia nie odzwierciedla żadnych zmian w ogóle na drugiej liście. – Antimonit
- 1. Płytka kopia hashsetu
- 2. std wektor C++ - głęboka lub płytka kopia
- 3. Płytka kopia i głęboka kopia w C
- 4. VirtualBox - Klon kontra Snapshot kontra Kopia zapasowa
- 5. Struktura obiektu 6 głęboka kopia/klon podmiotu o dynamicznej głębokości
- 6. Powracam List lub ArrayList
- 7. HTML5 Płytka bojlera plugins.js
- 8. Kątowa płytka bojlera
- 9. ICU iterate codepoints
- 10. Zmienne członów Iterate
- 11. Klon() ma chroniony dostęp - publiczny klon obiektu()
- 12. ArrayList zawiera inny ArrayList
- 13. Circular ArrayList (rozszerzenie ArrayList)
- 14. Konwersja podmenu ArrayList ArrayList
- 15. Counter wewnątrz pętli iterate smarty
- 16. Iterate nad obiektem w ES6
- 17. Programowo programuje ClosedXML iterate Worksheets.
- 18. Iterate tablicą, n przedmiotów naraz
- 19. Kopia zwrotna Java do ukrycia przyszłych zmian
- 20. <c: foreach jsp iterate over list
- 21. Głęboki klon elementu hibernacji
- 22. głęboka kopia zapisu doktrynowego
- 23. Klon() w języku Java
- 24. PHP kluczowe klon
- 25. Klon tylko jeden oddział
- 26. Java: klon naruszenie metoda
- 27. Dodatkowy telefon z Windows Phone 8 Płytka
- 28. Płytka dzieli równą wysokość ostatniego rzędu elementu
- 29. Odejmowanie jednej arrayList od innej arrayList
- 30. Co robi kopia hg?
Podczas wpisywania pytania powinieneś zobaczyć listę powiązanych pytań, które pojawiły się (ta sama lista, którą widzisz w prawej dolnej kolumnie tej strony). Zerknąłeś w nich? Dlaczego te odpowiedzi nie były wystarczające? Proszę opracuj. – BalusC
Przeszedłem przez okno. Nie było nic związanego z wydajnością pod względem iteratora ArrayList vs clone(). – tech20nn