Comment instancier un objet Queue en Java?


142

Quand j'essaye:

Queue<Integer> q = new Queue<Integer>();

le compilateur me donne une erreur. De l'aide?

De plus, si je veux initialiser une file d'attente, dois-je implémenter les méthodes de la file d'attente?


2
Avez-vous besoin que la file d'attente soit thread-safe?
Peter Lawrey

Réponses:


151

A Queueest une interface, ce qui signifie que vous ne pouvez pas construire Queuedirectement un .

La meilleure option est de construire hors une classe qui implémente déjà l' Queueinterface, comme un des éléments suivants: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueueou SynchronousQueue.

Une alternative est d'écrire votre propre classe qui implémente l'interface de file d'attente nécessaire. Ce n'est pas nécessaire sauf dans les rares cas où vous souhaitez faire quelque chose de spécial tout en fournissant au reste de votre programme un fichier Queue.

public class MyQueue<T extends Tree> implements Queue<T> {
   public T element() {
     ... your code to return an element goes here ...
   }

   public boolean offer(T element) {
     ... your code to accept a submission offer goes here ...
   }

   ... etc ...
}

Une alternative encore moins utilisée est de construire une classe anonyme qui implémente Queue. Vous ne voulez probablement pas faire cela, mais c'est répertorié comme une option pour couvrir toutes les bases.

new Queue<Tree>() {
   public Tree element() {
     ...
   };

   public boolean offer(Tree element) {
     ...
   };
   ...
};

21
Oh mon Dieu ... Je crains que quelqu'un qui lise ceci utilise un anonyme Queue... mais +1 quand même.
Tom

1
En fait, celui de Jon est plus clair. Je donnerai +1 si vous le mettez à jour pour mentionner la concurrence et vous débarrasser du code des classes anonymes ... Je pense que cela rend la réponse plus déroutante pour quelqu'un qui veut savoir quoi faire parce qu'il ne le veut presque sûrement pas fais ça. (Même s'ils voulaient leur propre cours, il n'est pas nécessaire de le rendre anonyme)
Tom

1
@Tom n'a pas retiré les informations de classe anonymes car il est bon de savoir que c'est possible, mais j'ai placé devant lui "Écrivez votre propre implémentation", ce qui l'éloigne des premières alternatives listées (plus courantes).
Edwin Buck

1
Pourquoi ne pas mentionnerArrayDeque
JW.ZG

Je ne parviens pas à trouver la méthode enqueue () dans aucune des classes que vous avez mentionnées, je ne peux trouver que la méthode add (), veuillez me corriger si je me trompe.
Sreekanth Karumanaghat le

152

Queueest une interface. Vous ne pouvez pas instancier une interface directement, sauf via une classe interne anonyme. Ce n'est généralement pas ce que vous voulez faire pour une collection. Au lieu de cela, choisissez une implémentation existante. Par exemple:

Queue<Integer> q = new LinkedList<Integer>();

ou

Queue<Integer> q = new ArrayDeque<Integer>();

En règle générale, vous choisissez une implémentation de collection en fonction des performances et des caractéristiques de concurrence qui vous intéressent.


9
De ArrayDeque : "Cette classe est susceptible d'être plus rapide que Stack lorsqu'elle est utilisée comme pile, et plus rapide que LinkedList lorsqu'elle est utilisée comme file d'attente". Cela est dû à la localisation des données compatible avec le cache du processeur et aux allocations moins fréquentes.
Vadzim

42
Queue<String> qe=new LinkedList<String>();

qe.add("b");
qe.add("a");
qe.add("c");

Puisqu'il Queues'agit d'une interface, vous ne pouvez pas en créer une instance comme vous l'avez illustré


1
java.util.Queueest une interface. Vous ne pouvez pas instancier des interfaces. Vous devez créer une instance d'une classe implémentant cette interface. Dans ce cas, une LinkedList est une telle classe.
Mihai Toader

@Tod yes was on the way .. :)
Jigar Joshi

Merci @JigarJoshi !! est-il possible de faire la même chose avec stack? Je n'ai rien trouvé.
Zehra Subaş

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Jigar Joshi

15

La file d'attente est une interface; vous ne pouvez pas explicitement construire une file d'attente. Vous devrez instancier l'une de ses classes d'implémentation. Quelque chose comme:

Queue linkedList = new LinkedList();

Voici un lien vers le tutoriel Java sur ce sujet.


cela ne fonctionne plus ..! Bien que cette déclaration fonctionne -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal

@MdFaisal Fonctionne très bien pour moi avec la version java "1.7.0_71"
zmf

12

entrez la description de l'image ici

L'interface Queue étend java.util.Collection avec des opérations d'insertion, d'extraction et d'inspection supplémentaires telles que:

+offer(element: E):booléen // Insertion d'un élément

+poll(): E // Récupère l'élément et retourne NULL si la file d'attente est vide

+remove(): E// Récupère et supprime l'élément et lève une exception si la file d'attente est vide

+peek(): E// Récupère, mais ne supprime pas, la tête de cette file d'attente, retournant null si cette file d'attente est vide.

+element(): E// Récupère, mais ne supprime pas, la tête de cette file d'attente, lève une exception si la file d'attente est vide.

Exemple de code pour l'implémentation de la file d'attente:

java.util.Queue<String> queue = new LinkedList<>();
queue.offer("Hello");
queue.offer("StackOverFlow");
queue.offer("User");

System.out.println(queue.peek());

while (queue.size() > 0){
    System.out.println(queue.remove() + " ");
}
//Since Queue is empty now so this will return NULL
System.out.println(queue.peek());

Sortie du code:

Hello
Hello 
StackOverFlow 
User 
null

7

Queue est une interface en java, vous ne pouvez pas faire ça.

Au lieu de cela, vous avez deux options:

Option 1:

Queue<Integer> Q = new LinkedList<>();

Option 2:

Queue<Integer> Q = new ArrayDeque<>();

Je recommande d'utiliser l'option2 car elle est un peu plus rapide que l'autre


5

La file d'attente en Java est définie comme une interface et de nombreuses implémentations prêtes à l'emploi sont présentes dans le cadre de la version JDK. En voici quelques-uns: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Linked Transfer Queue, Synchronous Queue, etc.

SO Vous pouvez créer n'importe laquelle de ces classes et la conserver comme référence de file d'attente. par exemple

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {

 public static void main (String[] args) {
  Queue que = new LinkedList();
  que.add("first");
  que.offer("second");
  que.offer("third");
  System.out.println("Queue Print:: " + que);
  
  String head = que.element();
  System.out.println("Head element:: " + head);
  
  String element1 = que.poll();
  System.out.println("Removed Element:: " + element1);
  
  System.out.println("Queue Print after poll:: " + que);
  String element2 = que.remove();
  System.out.println("Removed Element:: " + element2);
  
  System.out.println("Queue Print after remove:: " + que);  
 }
}

Vous pouvez également implémenter votre propre Queue personnalisée implémentant l'interface de Queue.


4

Queueest une interface en java, vous ne pourriez pas faire cela. essayer:

Queue<Integer> Q = new LinkedList<Integer>();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.