Où se trouve la classe Queue dans les collections Java?


Je ne vois qu'une interface de file d'attente, n'y a-t-il pas de classe de file d'attente dans les collections Java?

Author: Michael Myers, 2009-04-30

9 answers

Le Javadocs donner une liste de classes qui implémentent Queue.

Toutes les classes D'implémentation connues:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedBlockingDeque, LinkedList, PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Il y a aussi quelques sous-interfaces que vous pourriez trouver utiles:

Toutes les Sous-interfaces connues:

BlockingDeque, BlockingQueue, Deque

 31
Author: Michael Myers, 2009-04-30 17:49:47

La file d'attente a plusieurs implémentations: à partir de l'API:

Toutes les Classes D'implémentation connues:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Notez que AbstractQueue n'est pas une classe concrète.

Certains d'entre eux proviennent du package concurrent, donc si vous implémentez un jobqueue ou quelque chose de similaire, vous devriez opter pour ConcurrentLinkedQueue ou PriorityBlockingQueue (pour un tas) par exemple.

 10
Author: akappa, 2009-04-29 20:21:35

La documentation pour Queue liste diverses implémentations, y compris

Choisissez une implémentation qui convient à vos besoins.

 7
Author: Rob, 2009-04-29 20:20:35

En plus d'utiliser les documents de l'API pour trouver "toutes les classes d'implémentation connues", il existe souvent d'autres implémentations non publiques qui sont néanmoins disponibles via l'API publique (uniquement sans nécessiter de documentation inutile). Si vous cliquez sur "utiliser", vous trouverez également Collections.asLifoQueue (Deque est déjà un Queue, mais c'est FIFO plutôt qu'une pile).

 3
Author: Tom Hawtin - tackline, 2009-04-29 20:51:54

Http://java.sun.com/javase/6/docs/api/java/util/Queue.html see voir la section "Toutes les classes d'implémentation connues". Il existe une variété d'implémentations qui conviennent à des fins différentes.

 2
Author: Dave Costa, 2009-04-29 20:21:51

Bien que les réponses sonnent un peu méprisantes, Elles sont en fait assez cool en vous apprenant à pêcher. Une file d'attente est simplement un moyen de regarder une collection, de sorte que de nombreuses collections peuvent l'implémenter. De plus, les choses qui agissent comme des collections mais avec une autre logique spécifique (comme les files d'attente de threads) peuvent utiliser la même interface.

Savoir où regarder les javadocs est d'une grande aide. Je suis sûr que vous avez regardé mais que vous n'avez tout simplement pas pensé à regarder les implémentations. Vivre et apprendre.

Parfois, vous devrez peut-être également rechercher des listes de sous-classes/extensions. Comme si vous regardiez la file d'attente et voyiez AbstractQueue, vous voudrez peut-être voir quelles classes implémentent cela.

Je vais me débarrasser d'un de vos-1 pour toi :)

 2
Author: Bill K, 2009-04-29 21:12:18

Non, il n'y a pas de classe Queue, car il existe de nombreuses façons différentes d'implémenter une file d'attente et vous devez choisir celle qui convient à votre cas d'utilisation. Il en va de même pour toutes les autres collections du cadre collections - par exemple, ArrayList et LinkedList implémentent tous deux un List. Le modèle général, qui est un bon usage de l'héritage d'objet, est:

L'interface , par exemple Queue, définit le rôle que vous voulez qu'un objet joue;

Les Sous-interfaces, par exemple Deque, développe ou spécialise le rôle - dans ce cas, une file d'attente "deque" ou à double extrémité vous permet d'ajouter et de supprimer des éléments des deux extrémités de la file d'attente, par opposition à l'ajout uniquement à l'arrière et à la suppression de l'avant;

Les classes fournissent l'implémentation de la façon dont un objet remplit le rôle. Par exemple, un ArrayDeque utilise un tableau redimensionnable pour implémenter une file d'attente à double extrémité, qui a des forces et des faiblesses différentes de {[3] } qui utilise un liste.

Pour développer l'idée d'une interface en tant que rôle, notez que même si ArrayDeque implémente Deque, vous pouvez l'utiliser comme Queue sans avoir à vous soucier de cela car l'implémentation des deux interfaces signifie qu'il peut jouer les deux rôles. De même, LinkedList peut porter un List, Queue ou Deque chapeau.

Pour cette raison, la façon normale (recommandée) d'utiliser quelque chose comme le framework Collections est de programmer l'interface , c'est-à-dire d'utiliser une interface lors de l'utilisation de la classe plutôt que le nom de la classe elle-même. Par exemple, vous instanciez un objet comme ceci:

Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");

De cette façon, vous êtes

  • non lié à une classe particulière et peut utiliser un remplacement drop-in si nécessaire sans avoir à modifier beaucoup de code, et
  • documentent ce que vous faites avec une classe en nommant le rôle qu'elle joue. Le principe général avec lequel cela aide est code auto-documenté , qui consiste essentiellement à laisser le code lui-même être explicite sans avoir à utiliser des commentaires, etc.
 2
Author: Injektilo, 2012-12-12 17:47:02
    Queue<Integer> queue = new ArrayDeque<>();

    queue.add(1);
    queue.add(2);
    queue.add(3);

    while (!queue.isEmpty()) {
        System.out.println(queue.remove());// prints 1 2 3
    }

Vous pouvez également utiliser une liste de liens. Mais généralement, pour une file d'attente, ArrayDeque est préféré à LinkedList. Parce que ArrayDeque consomme moins de mémoire, est plus rapide et n'autorise pas les valeurs nulles. Ne pas autoriser null est bon, car si vous autorisez les null, alors lorsque vous faites un peek() ou poll (), vous pouvez obtenir un null même si la file d'attente n'est pas vide.

 2
Author: developer747, 2018-04-24 02:07:58
import java.util.Queue;

Juste ça

Enqueue function == Queue_Object.add(input_value);

Dequeue function == Queue_Object.pull();   //return the value and delete it from queue
 0
Author: FoOzA, 2011-08-21 20:33:27