Jaka jest różnica między LinkedList
i ArrayList
? Skąd mam wiedzieć, kiedy go użyć?Jaka jest różnica między LinkedList i ArrayList, a kiedy użyć której?
Odpowiedz
Nie należy również używać. Użyj System.Collections.Generic.List<T>
.
To naprawdę jest moja rekomendacja. Prawdopodobnie niezależnie od tego, jaka jest twoja aplikacja, ale tutaj jest trochę więcej kolorów, na wypadek, gdybyś zrobił coś, co wymaga tutaj precyzyjnie dostrojonego wyboru.
ArrayList
i LinkedList
to różne implementacje mechanizmu magazynowania dla List
. ArrayList
używa tablicy, którą musi zmienić rozmiar, jeśli twoja kolekcja przerasta bieżący rozmiar pamięci. Z drugiej strony, LinkedList
wykorzystuje strukturę danych z list powiązanych z CS 201. LinkedList
jest lepsza dla niektórych obciążeń ciężkich podczas wstawiania głowicy lub ogona, ale ArrayList
jest lepsza dla obciążeń dostępu losowego.
Dlaczego zaleca się, aby zawsze używać listy opartej na tablicy, gdy jawnie zapytał, kiedy każdy (array v. Link) jest najlepszy? –
Chodzi mi o to, że zazwyczaj nie musicie męczyć się nad wyborem. W bibliotekach baz podstawowych jest mnóstwo miejsc, w których otrzymujesz listę, niezależnie od tego, czy tego chcesz, czy nie. ('* .ToList()') 'LinkedList' nawet nie implementuje' IList', więc nie może być automatycznie użyty w wielu kontekstach 'List'. Jeśli chcesz użyć 'LinkedList' ze względu na wydajność, jest to całkiem w porządku, ale średnio tracisz więcej niż zyskujesz. – sblom
Nikt nie powiedział, że powinieneś cierpieć. Zwykle jest to stosunkowo prosta decyzja. Nie rozumiem, dlaczego uważasz, że musisz używać 'List' tylko dlatego, że robią to niektóre części standardowej biblioteki. 'LinkedList' celowo nie implementuje' IList', aby zminimalizować ryzyko niewłaściwego użycia. Nawet jeśli to prawda, że "średnio tracicie", PO nie pytał o średnią. Pytał o * kiedy * używać każdego. –
Różnica polega semantyki jak List
interfejs * jest realizowany:
http://en.wikipedia.org/wiki/Arraylist i http://en.wikipedia.org/wiki/LinkedList
* Znaczenie ten basic list operations
Możesz sprawdzić algorytmiczną złożoność każdej operacji na tych artykułach wikipedii. – pgb
Interfejs to 'IList
'List
różnica jest wewnętrzna struktura danych używana do przechowuj obiekty.
An ArrayList
użyje macierzy systemowej (np. Object[]
) i zmieni jej rozmiar w razie potrzeby. Z drugiej strony, LinkedList
użyje obiektu, który zawiera dane i wskaźnik do następnego i poprzedniego obiektu na liście.
Różne operacje będą miały różną złożoność algorytmiczną ze względu na tę różnicę w reprezentacji wewnętrznej.
Mają różną wydajność na "wkładkach" (dodawanie nowych elementów) i sprawdzeniach. Dla insertów ArrayLists utrzymuje tablicę wewnętrznie (początkowo 16 elementów), a po osiągnięciu maksymalnej pojemności podwaja rozmiar tablicy. Obiekt LinkedList jest pusty i dodaje element (węzeł) w razie potrzeby.
Myślę, że z ArrayList można indeksować elementy, podczas gdy z LinkedList trzeba "odwiedzić" przedmiot z głowy (lub linkList robi to automatycznie dla ciebie).
LinkedList posiada również O (1) usuwa, natomiast 'List
Główną różnicą pomiędzy ArrayList
i List<T>
, LinkedList<T>
i innych podobnych rodzajowych jest ArrayList
posiada Object
s, podczas gdy inni posiadają typ, który zdefiniowanych (tj. List<Point>
posiada tylko punkty).
Z tego powodu należy rzucić dowolny obiekt pobrany z ArrayList
do faktycznego typu. Może to zająć dużo miejsca na ekranie, jeśli masz długie nazwy klas.
Ogólnie rzecz biorąc, znacznie lepiej jest używać List<T>
i innych typów ogólnych, chyba że naprawdę potrzebujesz listy zawierającej wiele różnych typów obiektów.
ArrayList
ma dobrą zastępczą, która jest List<T>
.
Ogólnie List<T>
jest nakładką na tablicy - umożliwia indeksowanie i uzyskiwania dostępu do elementów w O (1), ale za każdym razem, gdy przekraczają zdolności O (n) należy zwrócić.
LinkedList<T>
nie pozwoli Ci uzyskać dostęp do elementów za pomocą indeksu, ale można liczyć, że wkładka zawsze będzie kosztować O (1). Ponadto można wstawiać elementy na początku listy i między istniejącymi pozycjami w O (1).
Myślę, że w większości przypadków domyślnym wyborem jest List<T>
. Wiele typowych scenariuszy nie wymaga specjalnego porządku i nie ma ścisłych ograniczeń złożoności, dlatego preferowane jest ustawienie List<T>
ze względu na jego prostotę użycia.
Jak stwierdził @sblom, należy użyć ogólnych odpowiedników obiektu LinkedList i ArrayList. Naprawdę nie ma powodu, aby tego nie robić, i wiele powodów.
Implementacja List jest skutecznie owijająca tablicę. Gdyby próba użytkownik wstawić elementy poza granice tablicy podkładowej, zostanie on skopiowany do większej tablicy (w znacznym kosztem, buit przejrzysty dla użytkowników Listy <T>)
LinkedList <T> ma całkowicie odmienna implementacja, w której dane przechowywane są w instancjach LinkedListNode <T>, które przenoszą odniesienia do dwóch innych instancji klasy LinkedListNode <T> (lub tylko jeden w przypadku nagłówka lub ogona listy). Nie tworzy się zewnętrznych odniesień do pozycji na środku listy. Oznacza to, że iteracja listy jest szybka, ale dostęp losowy jest powolny, ponieważ należy wykonać iterację węzłów z jednego lub drugiego końca. Najlepszym powodem użycia listy LinkedList jest umożliwienie szybkich wstawek, które polegają po prostu na zmianie referencji przechowywanych przez węzły, a nie przepisywaniu całej listy w celu wstawienia elementu (jak w przypadku listy T >)
- 1. Jaka jest różnica między Listą a ArrayList?
- 2. Jaka jest różnica między `after_create` i` after_save` oraz kiedy użyć?
- 3. Python: jaka jest różnica między (1,2,3) a [1,2,3], i kiedy powinienem użyć każdego?
- 4. Jaka jest różnica między HAVING a WHERE?
- 5. Jaka jest różnica między pakietem a intencją?
- 6. Jaka jest różnica między Progressbar a progressDialog?
- 7. Jaka jest różnica między kotem a nadrukiem?
- 8. Jaka jest różnica między przyszłym a shared_future?
- 9. Jaka jest różnica między opisem a żartem?
- 10. Jaka jest różnica między PTHREAD_RECURSIVE_MUTEX_INITIALIZER a PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP?
- 11. Jaka jest różnica między kulturą a UICulture?
- 12. Kiedy wiesz, kiedy użyć TreeSet lub LinkedList?
- 13. Jaka jest różnica między MongoTemplate a MongoRepository?
- 14. Jaka jest różnica między macierzą a tablix?
- 15. Jaka jest różnica między cat_id a term_id?
- 16. Jaka jest różnica między "<>" a "! ="?
- 17. Jaka jest różnica między Dispatcher.BeginInvoke a Task.Factory.StartNew
- 18. Jaka jest różnica między podprocesiem.popen a podprocesią.run?
- 19. Jaka jest różnica między kluczem a KeySpec?
- 20. Różnica między niezerowymi (a), gdzie (a) i argwhere (a). Kiedy użyć?
- 21. Jaka jest różnica między this.route() a this.resource()?
- 22. Jaka jest różnica między proxy a reify?
- 23. Jaka jest różnica między zmienną a podwójną?
- 24. Jaka jest różnica między „$ a” i $ a w Uniksie
- 25. Jaka jest różnica między? : i ||
- 26. Jaka jest różnica między tf.Session() i tf.InteractiveSession()?
- 27. Jaka jest różnica między tasklet a workqueue
- 28. Jaka jest różnica między IEnumerable a tablicami?
- 29. Jaka jest różnica między UIViewController a UITableViewController
- 30. Jaka jest różnica między @android a android:
Prosta dla ArrayList, nigdy. Użyj ogólnych kolekcji 'IList' i pokrewnych. –