160 votes

Comment instancier un objet Queue en java ?

Quand j'essaie :

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

le compilateur me donne une erreur. Vous pouvez m'aider ?

De même, si je veux initialiser une file d'attente, dois-je mettre en œuvre les méthodes de la file d'attente ?

2 votes

La file d'attente doit-elle être thread safe ?

1 votes

166voto

Jon Skeet Points 692016

Queue est une interface. Vous ne pouvez pas instancier une interface directement, sauf via une classe interne anonyme. En général, cette n'est pas ce que vous voulez faire pour une collection. Choisissez plutôt une implémentation existante. Par exemple :

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

o

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

En général, vous choisissez une implémentation de collection en fonction des caractéristiques de performance et de concurrence qui vous intéressent.

17 votes

Desde ArrayDeque : "Cette classe est susceptible d'être plus rapide que Stack lorsqu'elle est utilisée comme une pile, et plus rapide que LinkedList lorsqu'elle est utilisée comme une file d'attente". Cela est dû à une localisation des données favorable au cache du CPU et à des allocations moins fréquentes.

164voto

Edwin Buck Points 33097

A Queue est une interface, ce qui signifie qu'il est impossible de construire un fichier Queue directement.

La meilleure option est de construire à partir d'une classe qui implémente déjà l'option Queue comme l'une des suivantes : AbstractQueue , ArrayBlockingQueue , ArrayDeque , ConcurrentLinkedQueue , DelayQueue , LinkedBlockingQueue , LinkedList , PriorityBlockingQueue , PriorityQueue ou SynchronousQueue .

Une alternative est d'écrire votre propre classe qui implémente l'interface Queue nécessaire. Elle 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 une interface de type 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 n'avez probablement pas envie de faire cela, mais c'est une option pour couvrir toutes les bases.

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

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

23 votes

Oh là là... J'ai peur que quelqu'un lisant ceci utilise un anonyme Queue ... mais +1 quand même.

1 votes

En fait, celle de Jon est plus claire. Je veux bien +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 confuse pour quelqu'un qui veut savoir ce qu'il faut faire parce qu'il ne veut presque sûrement pas faire ça. (Même s'ils voulaient leur propre classe, il n'y a pas besoin de la rendre anonyme)

1 votes

@Tom n'a pas supprimé l'info sur la classe anonyme car il est bon de savoir que c'est possible, mais j'ai ajouté le "Ecrivez votre propre implémentation" avant, ce qui l'éloigne encore plus des premières alternatives listées (plus courantes).

43voto

Jigar Joshi Points 116533
Queue<String> qe=new LinkedList<String>();

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

Depuis Queue est une interface, vous ne pouvez pas créer une instance de celle-ci comme vous l'avez illustré.

1 votes

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

0 votes

@Tod oui était sur le chemin .. :)

0 votes

Merci @JigarJoshi ! !! y a-t-il un moyen de faire la même chose avec stack ? Je n'ai rien trouvé.

16voto

zmf Points 2367

Queue est une interface ; vous ne pouvez pas construire explicitement une Queue. Vous devez 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.

0 votes

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

0 votes

@MdFaisal Cela fonctionne bien pour moi avec la version java "1.7.0_71".

4voto

lcl Points 11

Queue est une interface en java, vous ne pourriez pas le faire. Essayez :

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

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