Comment instancier un objet Queue en Java?

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) {
     ...
   };
   ...
};
Edwin Buck
la source
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.

Jon Skeet
la source
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é

Jigar Joshi
la source
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.

zmf
la source
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
devDeejay
la source
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

Sujit
la source
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.

Java Guru
la source
4

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

Queue<Integer> Q = new LinkedList<Integer>();
lcl
la source