2010-09-12 12 views
43

Dlaczego niektóre struktury danych kolekcji nie utrzymują kolejności wstawiania? Co jest wyjątkowe w porównaniu z utrzymaniem porządku wstawiania? Czy coś zyskujemy, jeśli nie utrzymamy zamówienia?Kolekcje Java utrzymujące zamówienie reklamowe

+1

Na przykład, dlaczego 'java.util.HashSet' musi zachować kolejność wstawiania? –

+0

no .. pytam .. niczego nie tracimy podczas utrzymywania zamówienia ..contrary czy coś zyskujemy, jeśli nie utrzymamy zamówienia – JavaUser

+0

np .: LinkedList. Pomyśl o tym, czy nie byłoby łatwiej dołączyć/dołączyć do listy połączonej niż wstawić ją w środku? – st0le

Odpowiedz

70

Wydajność. Jeśli chcesz oryginalnego zamówienia reklamowego, istnieją klasy LinkedXXX, które utrzymują dodatkową listę powiązań w zamówieniu reklamowym. Przez większość czasu nie obchodzi cię to, więc używasz HashXXX, lub chcesz naturalnej kolejności, więc używasz TreeXXX. W każdym z tych przypadków, dlaczego powinieneś zapłacić dodatkowy koszt połączonej listy?

+7

Gdzie "Tablica" pasuje do odpowiedzi? – ADTC

+0

@ADTC To nie pasuje do odpowiedzi. – EJP

+0

Cóż, ArrayList utrzymuje kolejność wstawiania z podkładem tablicy, ale przypuszczam, że wydajność jest gorsza niż klasy LinkedXXX? – ADTC

2

Zależy od tego, co trzeba zrobić, aby zrobić dobrze. Zamówienie reklamowe zwykle nie jest interesujące, więc nie trzeba go aktualizować, aby można było je zmienić, aby uzyskać lepszą wydajność.

W przypadku Map zwykle używana jest mapa HashMap i TreeMap. Używając kodów hashowych, wpisy mogą być umieszczane w małych grupach, które można łatwo przeszukiwać. TreeMap utrzymuje posortowaną kolejność wstawianych wpisów kosztem wolniejszego wyszukiwania, ale łatwiej sortować niż HashMap.

2

Podczas korzystania z HashSet (lub HashMap) dane są przechowywane w "segmentach" na podstawie wartości skrótu obiektu. W ten sposób Twoje dane są łatwiej dostępne, ponieważ nie musisz szukać tych konkretnych danych w całym zestawie, musisz po prostu spojrzeć w odpowiednie wiadro.

W ten sposób można zwiększyć wydajność w określonych punktach.

Każda realizacja kolekcji ma swoją specyfikę, aby ułatwić jej używanie w pewnych warunkach. Każda z tych cech ma koszt. Jeśli więc naprawdę tego nie potrzebujesz (na przykład zamówienie reklamowe), lepiej skorzystaj z implementacji, która go nie oferuje i lepiej odpowiada Twoim wymaganiom.

-1

nie mogę cytować odniesienia, ale z projektem implementacje interfejsu CollectionList i Set są zasadniczo rozsuwalność Array s. Ponieważ domyślnie Collections oferuje metody do dynamicznego dodawania elementów w dowolnym punkcie, co nie jest możliwe, nie można zachować kolejności wstawiania. Tak więc, ponieważ istnieje więcej metod manipulacji zawartością, istnieje potrzeba specjalnych implementacji, które zachowują porządek.

Kolejną kwestią jest wydajność, ponieważ najlepiej działającą Collection może nie być ta, która zachowuje kolejność wstawiania. Nie jestem jednak pewien, jak dokładnie Collections zarządza swoją zawartością w celu zwiększenia wydajności.

Tak, w skrócie, dwa główne powody, mogę myśleć dlaczego istnieją zamówień zachowaniu Collection implementacje są:

  1. architektura Klasa
  2. Wydajność
+0

Zauważ, że 'Tablice' to rzeczywista klasa, natomiast tablice są specjalnym typem obiektów kontenerowych. Jestem też całkiem pewien, że 'LinkedList' faktycznie używa połączonej listy, ale nie przeczytałem kodu. :-) – wds

+0

Ok, podjąłem decyzję, zredagowałem mój post. O twoim komentarzu "LinkedList": gdzie jest sprzeczność z tym, co napisałem? – FK82

+0

Aby wyjaśnić: 'LinkedList' afaik jest' List' (czytaj rozszerzalny 'Array'), którego kolejność wstawiania jest utrzymywana w innej' Liście' (dwie z nich są * połączone *, stąd nazwa). Czy też nie mam racji? – FK82

7
  • Kolejność wstawiania z natury nie jest utrzymywane w hash tables - tak właśnie działają (przeczytaj link do artykułu, aby zrozumieć szczegóły). Możliwe jest dodawanie logiki w celu zachowania kolejności wstawiania (jak w przypadku LinkedHashMap), ale wymaga to więcej kodu, aw czasie wykonywania więcej pamięci i więcej czasu. Utrata wydajności zazwyczaj nie jest znacząca, ale może być.
  • W przypadku TreeSet/Map głównym powodem ich użycia jest naturalna kolejność iteracji i inne funkcje dodane w interfejsie SortedSet/Map.
+2

+1 Za wzmianka "ale to wymaga więcej kodu". – helpermethod

+1

Krótko mówiąc: implementacje 'Map' nie są" kolekcjami ", ponieważ nie implementują interfejsu' Collection'. Mają podobne metody, ale to wszystko. Sprawdź: http://download.oracle.com/javase/1.4.2/docs/guide/collections/overview.html (#Collection Interfaces) Najprawdopodobniej pytanie OP również dotyczy map. – FK82

0

Dlaczego należy zachować kolejność wstawiania? Jeśli używasz HashMap, możesz uzyskać wpis przez key. Nie oznacza to, że nie zapewnia klas, które robią to, co chcesz.

16

Kolekcje nie zachowują kolejności wstawiania. Niektórzy po prostu domyślnie dodają nową wartość na końcu. Utrzymywanie porządku wstawiania jest przydatne tylko wtedy, gdy priorytetowo traktuje się obiekty lub używa go do sortowania obiektów w pewien sposób.

Jeśli chodzi o powody, dla których niektóre zbiory utrzymują je domyślnie, a inne nie, przyczyną jest głównie implementacja i tylko czasami część definicji kolekcji.

  • Listy utrzymać porządek wstawiania jak tylko dodanie nowego wpisu na końcu lub na początku jest najszybszy wdrożenie metody add (Object).

  • Zestawy Wdrożenia Hashset i TreeSet nie utrzymują kolejność wstawiania jako obiekty są sortowane na szybkie wyszukiwanie i utrzymywanie porządku wstawiania będzie wymagać dodatkowej pamięci. Powoduje to zwiększenie wydajności, ponieważ kolejność wstawiania prawie nigdy nie jest interesująca dla zestawów.

  • ArrayDeque deque można stosować do prostych que i stosu więc chcesz mieć „” First In First Out „” lub „” pierwszy w ostatnim out „” zachowania, oba wymagają że ArrayDeque utrzymuje porządek wstawiania. W takim przypadku zamówienie reklamowe jest utrzymywane jako główna część umowy o uczestnictwo w zajęciach.

+2

bardzo pouczające, zwłaszcza na temat ArrayDeque. – Jayy

0

Tam to odcinek w O'Reilly Cookbook Java o nazwie „Unikanie chęć do sortowania” Pytanie powinno być pytanie jest właściwie przeciwieństwem oryginalnego pytanie ... „Czy możemy coś zyskać sortując? " Wysilenie tego zamówienia wymaga wiele wysiłku. Z pewnością sortowanie jest łatwe, ale zwykle nie jest skalowane w większości programów. Jeśli masz zamiar obsłużyć tysiące lub dziesiątki tysięcy żądań (insrt, del, get, itp.) Na sekundę, czy nie używasz posortowanej lub niesortowanej struktury danych, to poważnie się liczy.

-1

Okej ... więc te posty są stare w porównaniu do teraz, ale zamówienie reklamowe jest potrzebne w zależności od potrzeb lub wymagań aplikacji, więc po prostu użyj odpowiedniego typu kolekcji. W większości przypadków nie jest to konieczne, ale w sytuacji, w której trzeba używać obiektów w kolejności, w której były przechowywane, widzę wyraźną potrzebę. Myślę, że porządek ma znaczenie podczas tworzenia, na przykład, kreatora lub mechanizmu przepływu lub czegoś podobnego, gdzie trzeba przejść od stanu do stanu lub coś podobnego. W tym sensie możesz odczytywać rzeczy z listy bez konieczności śledzenia tego, co potrzebujesz dalej lub przechodzenia przez listę, aby znaleźć to, czego szukasz. Pomaga w osiągnięciu wydajności w tym sensie. Ma to znaczenie, inaczej te zbiory nie miałyby większego sensu.

0

Niektóre kolekcje nie zachowują zamówienia, ponieważ obliczają kod hash i przechowują go odpowiednio w odpowiednim segmencie.