Jak utworzyć wystąpienie obiektu Queue w Javie?

Odpowiedzi:

151

A Queueto interfejs, co oznacza, że ​​nie można Queuebezpośrednio utworzyć .

Najlepszym rozwiązaniem jest zbudowanie od klasy, która już implementuje Queueinterfejs, jak jeden z następujących elementów: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, lub SynchronousQueue.

Alternatywą jest napisanie własnej klasy, która implementuje niezbędny interfejs Queue. Nie jest to potrzebne, z wyjątkiem tych rzadkich przypadków, w których chcesz zrobić coś specjalnego, zapewniając reszcie programu rozszerzenie 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 ...
}

Jeszcze mniej używaną alternatywą jest skonstruowanie anonimowej klasy, która implementuje Queue. Prawdopodobnie nie chcesz tego robić, ale jest to wymienione jako opcja ze względu na objęcie wszystkich podstaw.

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

   public boolean offer(Tree element) {
     ...
   };
   ...
};
Edwin Buck
źródło
21
Ojej ... Obawiam się, że ktoś, kto to przeczyta, użyje anonimowego Queue... ale i tak +1.
Tom
1
Właściwie Jon's jest bardziej jasny. Dam +1, jeśli zaktualizujesz go, aby wspomnieć o współbieżności i pozbędziesz się kodu dla klas anonimowych ... Myślę, że to sprawia, że ​​odpowiedź jest bardziej zagmatwana dla kogoś, kto chce wiedzieć, co robić, ponieważ prawie na pewno nie chce Zrób to. (Nawet jeśli chcieliby mieć własną klasę, nie ma potrzeby, aby była anonimowa)
Tom
1
@Tom nie wyjął anonimowych informacji o klasie, ponieważ dobrze jest wiedzieć, że jest to możliwe, ale umieściłem przed nim „Napisz własną implementację”, co oddala ją dalej od pierwszej wymienionej (bardziej powszechnej) alternatywy.
Edwin Buck,
1
Dlaczego nie wspomniećArrayDeque
JW.ZG
Nie jestem w stanie znaleźć metody enqueue () w żadnej z wymienionych przez Ciebie klas, jestem w stanie znaleźć tylko metodę add (), proszę poprawić mnie, jeśli się mylę.
Sreekanth Karumanaghat
152

Queueto interfejs. Nie można bezpośrednio utworzyć wystąpienia interfejsu, z wyjątkiem anonimowej klasy wewnętrznej. Zwykle nie jest to to, co chcesz zrobić dla kolekcji. Zamiast tego wybierz istniejącą implementację. Na przykład:

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

lub

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

Zazwyczaj implementację kolekcji wybiera się na podstawie interesujących Cię parametrów wydajności i współbieżności.

Jon Skeet
źródło
9
From ArrayDeque : „Ta klasa prawdopodobnie będzie szybsza niż Stack, gdy jest używana jako stos, i szybsza niż LinkedList, gdy jest używana jako kolejka”. Wynika to z lokalizacji danych przyjaznych dla pamięci podręcznej procesora i rzadszych alokacji.
Vadzim
42
Queue<String> qe=new LinkedList<String>();

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

Ponieważ Queuejest to interfejs, nie możesz utworzyć jego instancji, jak pokazano na ilustracji

Jigar Joshi
źródło
1
java.util.Queueto interfejs. Nie możesz tworzyć instancji interfejsów. Musisz utworzyć instancję klasy implementującej ten interfejs. W tym przypadku taką klasą jest LinkedList.
Mihai Toader
@Tod tak było w drodze .. :)
Jigar Joshi
Dzięki @JigarJoshi !! czy istnieje sposób na zrobienie tego samego ze stosem? Nic nie mogłem znaleźć.
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

Kolejka to interfejs; nie możesz jawnie skonstruować kolejki. Będziesz musiał utworzyć wystąpienie jednej z jego klas implementujących. Coś jak:

Queue linkedList = new LinkedList();

Oto link do samouczka Java na ten temat.

zmf
źródło
to już nie działa ..! Chociaż ta deklaracja działa -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal,
@MdFaisal Działa dobrze dla mnie w wersji java "1.7.0_71"
zmf
12

wprowadź opis obrazu tutaj

Interfejs Queue rozszerza java.util.Collection o dodatkowe operacje wstawiania, wyodrębniania i kontroli, takie jak:

+offer(element: E):boolean // Wstawianie elementu

+poll(): E // Pobiera element i zwraca NULL, jeśli kolejka jest pusta

+remove(): E// Pobiera i usuwa element oraz zgłasza wyjątek, jeśli kolejka jest pusta

+peek(): E// Pobiera, ale nie usuwa nagłówka tej kolejki, zwracając wartość null, jeśli ta kolejka jest pusta.

+element(): E// Pobiera, ale nie usuwa nagłówka tej kolejki, zgłasza wyjątek, jeśli kolejka jest pusta.

Przykładowy kod implementacji kolejki:

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

Wyjście kodu:

Hello
Hello 
StackOverFlow 
User 
null
devDeejay
źródło
7

Kolejka to interfejs w javie, nie możesz tego zrobić.

Zamiast tego masz dwie opcje:

opcja 1:

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

Opcja 2:

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

Polecam użycie opcji 2, ponieważ jest nieco szybsza niż druga

Sujit
źródło
5

Kolejka w Javie jest definiowana jako interfejs, a wiele gotowych do użycia implementacji jest obecnych jako część wydania JDK. Oto kilka: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Linked Transfer Queue, Synchronous Queue itp.

SO Możesz stworzyć dowolną z tych klas i trzymać ją jako odwołanie do kolejki. na przykład

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

Możesz również zaimplementować własny interfejs kolejki implementujący kolejkę.

Java Guru
źródło
4

Queuejest interfejsem w Javie, nie możesz tego zrobić. próbować:

Queue<Integer> Q = new LinkedList<Integer>();
lcl
źródło