Dlaczego warto używać Deque over Stack?
Potrzebuję Stack
struktury danych do mojego przypadku użycia. Powinienem być w stanie wcisnąć elementy do struktury danych i chcę tylko pobrać ostatni element ze stosu . The JavaDoc for Stack says:
Bardziej kompletny i spójny zestaw operacji stosu LIFO to dostarczane przez interfejs Deque i jego implementacje, które powinny być używane w preferencjach dla tej klasy. Na przykład:
Deque<Integer> stack = new ArrayDeque<>();
Zdecydowanie nie chcę synchronizować zachowania tutaj, ponieważ będzie używać tej struktury danych lokalnie do metody . Poza tym dlaczego mam tu woleć Deque
nad Stack
?
P. S: javadoc z Deque mówi:
Deques może być również używany jako stosy LIFO (Last-In-First-Out). To interfejs powinien być używany w preferencjach do klasy starszego stosu.
3 answers
Po pierwsze, jest to bardziej rozsądne pod względem dziedziczenia. Fakt, że Stack
rozszerza Vector
jest naprawdę dziwny, moim zdaniem. Na początku Javy dziedziczenie było nadużywane IMO - Properties
jako kolejny przykład.
Dla mnie kluczowe słowo w przytoczonych dokumentach jest spójne. Deque
wyświetla zestaw operacji, który polega na możliwości pobierania/dodawania / usuwania elementów z początku lub końca kolekcji, iteracji itp. - i to wszystko. Celowo nie ma możliwości dostępu do elementu według pozycji, która Stack
eksponuje , ponieważ jest podklasą Vector
.
Oh, a także Stack
nie ma interfejsu, więc jeśli wiesz, że potrzebujesz Stack
operacji, kończysz na zaangażowaniu się w konkretną konkretną klasę, co zwykle nie jest dobrym pomysłem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 05:49:35
Oto moja interpretacja niespójności wymienionej w opisie klasy stosu.
Jeśli spojrzysz na implementacje ogólnego przeznaczenia tutaj - zobaczysz, że istnieje spójne podejście do implementacji zestawu, Mapy i listy.
Dla zestawu i mapy mamy 2 standardowe implementacje z hash mapami i drzewami. Pierwszy jest najczęściej używany, a drugi jest używany, gdy potrzebujemy uporządkowanej struktury (a także implementuje własny interfejs-SortedSet lub SortedMap).
Możemy użyć preferowanego stylu deklarowania jak
Set<String> set = new HashSet<String>();
zobacz powody tutaj .
Ale Klasa stosu: 1) nie ma własnego interfejsu; 2) jest podklasą klasy wektorowej-która jest oparta na tablicy z możliwością zmiany rozmiaru; więc gdzie jest implementacja listy linkowanej stosu?
W interfejsie Deque nie mamy takich problemów, w tym dwóch implementacji (resizable array - ArrayDeque; linked list-LinkedList).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 14:11:30
Deque jest używany w sytuacji, w której chcemy pobierać elementy zarówno z głowy, jak i z ogona. Jeśli chcesz prosty stos, nie musisz iść po deque.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-21 05:43:33