195 votes

Pourquoi devrais-je utiliser Deque-dessus de la Pile?

J'ai besoin d'un Stack discbased pour mon cas d'utilisation. Je devrais être capable de pousser des objets dans le discbased et je veux seulement récupérer le dernier élément de la Pile . La JavaDoc de la Pile , dit :

Un plus ensemble complet et cohérent de la pile LIFO opérations est fournis par l'interface Deque et sa mise en oeuvre, qui doit être utilisé de préférence à cette classe. Par exemple:

Deque<Integer> stack = new ArrayDeque<Integer>();

Je certainement ne voulez pas synchronisés comportement ici, comme je vais l'être à l'aide de cette discbased locale à une méthode . En dehors de ce pourquoi je préfère Deque sur Stack ici ?

P. S: La javadoc de Deque dit :

Deques peut également être utilisé comme LIFO (Last-In-First-Out) des piles. Cette l'interface doit être utilisé de préférence à l'héritage de la Pile de la classe.

231voto

Jon Skeet Points 692016

Pour une chose, c'est plus raisonnable en matière de droits de succession. Le fait qu' Stack s'étend Vector est vraiment étrange, de mon point de vue. À Java, l'héritage a été galvaudé de l'OMI - Properties est un autre exemple.

Pour moi, le mot dans les docs que vous avez cité est conforme. Deque expose un ensemble d'opérations qui est tout au sujet d'être en mesure de chercher/ajouter/supprimer des éléments à partir du début ou de la fin d'une collection, d'itérer etc - et c'est tout. Il n'y a volontairement pas de moyen d'accéder à un élément en position, Stack expose parce que c'est une sous-classe de Vector.

Oh, et aussi Stack n'a pas d'interface, donc si vous savez que vous avez besoin d' Stack des opérations de fin de commettre à un béton de classe, ce qui n'est généralement pas une bonne idée.

5voto

irudyak Points 39

Voici mon interprétation d'incompatibilité mentionnés dans la description de la classe Stack.

Si vous regardez des fins Générales Implémentations ici , vous le verrez il y a une approche cohérente de la mise en œuvre de l'ensemble, d'une carte et de la liste.

  • Pour définir et carte nous avons 2 mise en œuvre standard avec pommes de cartes et arbres. La première est la plus utilisée et la seconde est utilisée lorsque nous avons besoin d'une structure ordonnée (et il met également en œuvre sa propre interface SortedSet ou SortedMap).

  • Nous pouvons utiliser le style préféré de déclarer comme Set<String> set = new HashSet<String>();voir les raisons ici.

Mais la classe de Pile: 1) ne pas avoir sa propre interface; 2) est une sous-classe de la classe Vector - qui est basé sur redimensionnable tableau; alors où est la liste liée de mise en œuvre de la pile?

Dans l'interface Deque nous n'avons pas de tels problèmes, y compris deux implémentations (tableau redimensionnable - ArrayDeque; liste chaînée - LinkedList).

-4voto

Edge Points 461

Deque est utilisé est la situation où vous souhaitez récupérer des éléments à la fois la tête et la queue. Si vous voulez une simple pile il n'est pas nécessaire d'aller pour un deque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X