Como instanciar um objeto Queue em java?

Respostas:

151

A Queueé uma interface, o que significa que você não pode construir uma Queuediretamente.

A melhor opção é construir fora de uma classe que já implementa a Queueinterface, como um dos seguintes: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, ou SynchronousQueue.

Uma alternativa é escrever sua própria classe, que implementa a interface de fila necessária. Não é necessário, exceto nos casos raros em que você deseja fazer algo especial, fornecendo ao restante do seu programa a 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 ...
}

Uma alternativa ainda menos usada é construir uma classe anônima que implemente Queue. Você provavelmente não quer fazer isso, mas está listado como uma opção para cobrir todas as bases.

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

   public boolean offer(Tree element) {
     ...
   };
   ...
};
Edwin Buck
fonte
21
Oh querida ... eu temo que alguém que leia isso use um anônimo Queue... mas +1 de qualquer maneira.
Tom
1
Na verdade, Jon's é mais claro. Marcarei +1 se você atualizá-lo para mencionar simultaneidade e se livrar do código para classes anônimas ... Acho que isso torna a resposta mais confusa para alguém que quer saber o que fazer, porque quase certamente não quer faça isso. (Mesmo que eles queriam a sua própria classe, não há necessidade de fazer isso de forma anônima)
Tom
1
O @Tom não retirou as informações da classe anônima, pois é bom saber que é possível, mas coloquei a opção "Escreva sua própria implementação" antes dela, o que a afasta ainda mais das primeiras alternativas listadas (mais comuns).
Edwin Buck
1
Por que não mencionarArrayDeque
JW.ZG
Não consigo encontrar o método enqueue () em nenhuma das classes mencionadas, apenas o método add (), por favor, corrija-me se estiver errado.
Sreekanth Karumanaghat
152

Queueé uma interface. Você não pode instanciar uma interface diretamente, exceto por meio de uma classe interna anônima. Normalmente, não é isso que você deseja fazer para uma coleção. Em vez disso, escolha uma implementação existente. Por exemplo:

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

ou

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

Normalmente, você escolhe uma implementação de coleção pelas características de desempenho e simultaneidade em que está interessado.

Jon Skeet
fonte
9
De ArrayDeque : "É provável que esta classe seja mais rápida que Stack quando usada como pilha e mais rápida que LinkedList quando usada como fila". É devido à localidade de dados compatível com o cache da CPU e alocações menos frequentes.
Vadzim
42
Queue<String> qe=new LinkedList<String>();

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

Como Queueé uma interface, você não pode criar uma instância dela como ilustrou

Jigar Joshi
fonte
1
java.util.Queueé uma interface. Você não pode instanciar interfaces. Você precisa criar uma instância de uma classe implementando essa interface. Nesse caso, um LinkedList é uma classe.
Mihai Toader
Sim @Tod estava a caminho .. :)
Jigar Joshi
Obrigado @JigarJoshi !! Existe alguma maneira de fazer a mesma coisa com a pilha? Não consegui encontrar nada.
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

Fila é uma interface; você não pode construir explicitamente uma fila. Você precisará instanciar uma de suas classes de implementação. Algo como:

Queue linkedList = new LinkedList();

Aqui está um link para o tutorial Java sobre este assunto.

zmf
fonte
isso não está mais funcionando ..! Embora esta declaração esteja funcionando -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal
Bem @MdFaisal funciona para mim w / java version "1.7.0_71"
ZMF
12

insira a descrição da imagem aqui

A interface Queue estende o java.util.Collection com operações adicionais de inserção, extração e inspeção, como:

+offer(element: E):boolean // Inserindo um elemento

+poll(): E // Recupera o elemento e retorna NULL se a fila estiver vazia

+remove(): E// Recupera e remove o elemento e lança uma exceção se a fila estiver vazia

+peek(): E// Recupera, mas não remove, o cabeçalho desta fila, retornando nulo se esta fila estiver vazia.

+element(): E// Recupera, mas não remove, o cabeçalho desta fila, lança uma exceção se a fila estiver vazia.

Código de exemplo para implementar a fila:

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());

Saída do código:

Hello
Hello 
StackOverFlow 
User 
null
devDeejay
fonte
7

Fila é uma interface em java, você não pode fazer isso.

Em vez disso, você tem duas opções:

Opção 1:

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

opção 2:

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

Eu recomendo usar a opção2, pois é um pouco mais rápida que a outra

Sujit
fonte
5

A fila em Java é definida como uma interface e muitas implementações prontas para uso estão presentes como parte do release do JDK. Aqui estão alguns: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Fila de transferência vinculada, Fila síncrona etc.

SO Você pode criar qualquer uma dessas classes e mantê-la como referência da fila. por exemplo

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);  
 }
}

Você também pode implementar sua própria interface de fila de implementação de fila personalizada.

Java Guru
fonte
4

Queueé uma interface em java, você não poderia fazer isso. experimentar:

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