Как создать экземпляр объекта очереди в java?


147

Когда я пытаюсь:

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

компилятор выдает ошибку. Любая помощь?

Кроме того, если я хочу инициализировать очередь, нужно ли мне реализовать методы очереди?


2
Вам нужно, чтобы очередь была потокобезопасной?
Питер Лоури

Ответы:


153

A Queue- это интерфейс, что означает, что вы не можете создать Queueнапрямую.

Наилучшим вариантом является построение от класса , который уже реализует Queueинтерфейс, как один из следующих: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, или SynchronousQueue.

Альтернативный вариант - написать собственный класс, реализующий необходимый интерфейс Queue. Это не требуется, за исключением тех редких случаев, когда вы хотите сделать что-то особенное, предоставляя остальной части вашей программы расширение 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 ...
}

Еще менее используемая альтернатива - создание анонимного класса, который реализует Queue. Вы, вероятно, не захотите этого делать, но это указано как вариант, чтобы охватить все основы.

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

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

22
О боже ... Я боюсь, что кто-то, читающий это, будет использовать аноним Queue... но в любом случае +1.
Tom

1
На самом деле, Джон более ясен. Я добавлю +1, если вы обновите его, чтобы упомянуть параллелизм и избавиться от кода для анонимных классов ... Я думаю, что это делает ответ более запутанным для тех, кто хочет знать, что делать, потому что они почти наверняка не хотят сделай это. (Даже если им нужен собственный класс, нет необходимости делать его анонимным)
Том

1
@Tom не извлекал анонимную информацию о классе, так как хорошо знать, что это возможно, но я поставил перед ней «Напишите свою собственную реализацию», которая отдаляет ее дальше от первых перечисленных (более распространенных) альтернатив.
Эдвин Бак

1
Почему бы не упомянутьArrayDeque
JW.ZG

Я не могу найти метод enqueue () ни в одном из упомянутых вами классов, я могу найти только метод add (), поправьте меня, если я ошибаюсь.
Sreekanth Karumanaghat

157

Queueэто интерфейс. Вы не можете создать экземпляр интерфейса напрямую, кроме как через анонимный внутренний класс. Обычно это не то, что вы хотите сделать для коллекции. Вместо этого выберите существующую реализацию. Например:

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

или

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

Обычно вы выбираете реализацию коллекции по интересующим вас характеристикам производительности и параллелизма.


11
Из ArrayDeque : «Этот класс, вероятно, будет быстрее, чем Stack при использовании в качестве стека, и быстрее, чем LinkedList при использовании в качестве очереди». Это связано с локализацией данных, удобной для кеширования процессора, и менее частым распределением.
Вадим

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

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

Поскольку Queueэто интерфейс, вы не можете создать его экземпляр, как вы проиллюстрировали.


1
java.util.Queueэто интерфейс. Вы не можете создавать экземпляры интерфейсов. Вам необходимо создать экземпляр класса, реализующего этот интерфейс. В данном случае таким классом является LinkedList.
Mihai Toader

@Tod да был в пути .. :)
Джигар Джоши

Спасибо, @JigarJoshi !! есть ли способ сделать то же самое со стеком? Я ничего не нашел.
Zehra Subaş 07

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Джигар Джоши

16

Очередь - это интерфейс; вы не можете явно создать очередь. Вам нужно будет создать экземпляр одного из его реализующих классов. Что-то типа:

Queue linkedList = new LinkedList();

Вот ссылка на учебник по Java по этой теме.


это больше не работает ..! Хотя это объявление работает -> Queue <Character> queue = new ArrayDeque <Character> ();
Md Faisal

@MdFaisal У меня отлично работает с версией java "1.7.0_71"
zmf

12

введите описание изображения здесь

Интерфейс Queue расширяет java.util.Collection дополнительными операциями вставки, извлечения и проверки, например:

+offer(element: E):логическое // Вставка элемента

+poll(): E // Извлекает элемент и возвращает NULL, если очередь пуста

+remove(): E// Извлекает и удаляет элемент и выдает исключение, если очередь пуста

+peek(): E// Извлекает, но не удаляет заголовок этой очереди, возвращая null, если эта очередь пуста.

+element(): E// Извлекает, но не удаляет заголовок этой очереди, выдает исключение, если очередь te пуста.

Пример кода для реализации очереди:

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

Вывод кода:

Hello
Hello 
StackOverFlow 
User 
null

7

Очередь - это интерфейс в java, вы не можете этого сделать.

Вместо этого у вас есть два варианта:

Опция 1:

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

option2:

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

Я рекомендую использовать вариант 2, так как он немного быстрее, чем другие


6

Очередь в Java определяется как интерфейс, и многие готовые к использованию реализации представлены как часть выпуска JDK. Вот некоторые из них: LinkedList , Priority Queue, ArrayBlockingQueue, ConcurrentLinkedQueue, Linked Transfer Queue, Synchronous Queue и т. Д.

SO Вы можете создать любой из этих классов и сохранить его как ссылку на очередь. например

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

Вы также можете реализовать свою собственную очередь, реализующую интерфейс Queue.


4

Queueэто интерфейс в java, вы не могли этого сделать. пытаться:

Queue<Integer> Q = new LinkedList<Integer>();
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.