Як створити об'єкт черги в Java?


142

Коли я намагаюся:

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

компілятор видає мені помилку. Будь-яка допомога?

Крім того, якщо я хочу ініціалізувати чергу, чи потрібно мені реалізувати методи черги?


2
Вам потрібна черга, щоб бути безпечною ниткою?
Пітер Лорі

Відповіді:


151

A Queue- це інтерфейс, який означає, що ви не можете створити Queueбезпосередньо.

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

Альтернативою є написання власного класу, який реалізує необхідний інтерфейс черги. Це не потрібно, за винятком тих рідкісних випадків, коли ви хочете зробити щось особливе, надаючи решту своєї програми а 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) {
     ...
   };
   ...
};

21
Боже мій ... Я боюся, що хтось, читаючи це, буде використовувати анонімний Queue... але +1 у будь-якому разі.
Том

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

1
@Tom не вивів інформацію про анонімний клас, бо добре знати, що це можливо, але я вкладаю перед ним "Напишіть власну реалізацію", яка віддаляє її від перших перерахованих (більш поширених) альтернатив.
Едвін Бак

1
Чому б не згадатиArrayDeque
JW.ZG

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

152

Queueє інтерфейсом. Інтерфейс неможливо створити безпосередньо, крім анонімного внутрішнього класу. Зазвичай це не те, що ви хочете зробити для колекції. Замість цього виберіть існуючу реалізацію. Наприклад:

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

або

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

Зазвичай ви обираєте реалізацію колекції за характеристиками продуктивності та паралельності, які вас цікавлять.


9
Від 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 yes був у дорозі .. :)
Jigar Joshi

Дякую @JigarJoshi !! чи можна зробити те ж саме із стеком? Я нічого не міг знайти.
Зехра Субаш

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Joshi

15

Черга - інтерфейс; ви не можете чітко побудувати чергу. Вам доведеться створити один із його класів реалізації. Щось на зразок:

Queue linkedList = new LinkedList();

Ось посилання на підручник з Java на цю тему.


це вже не працює ..! Хоча ця декларація працює -> Черга <Character> черга = новий ArrayDeque <Character> ();
Md Faisal

@MdFaisal мені добре працює з версією java "1.7.0_71"
zmf

12

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

Інтерфейс черги розширює java.util.Collection з додатковими операціями вставки, вилучення та перевірки, як-от:

+offer(element: E):булева // Вставка елемента

+poll(): E // Отримує елемент і повертає NULL, якщо черга порожня

+remove(): E// Отримує та видаляє елемент та видаляє виняток, якщо черга порожня

+peek(): E// Отримує, але не видаляє, голову цієї черги, повертаючи нуль, якщо ця чергу порожня.

+element(): E// Отримує, але не видаляє, голова цієї черги, викидає виняток, якщо черга порожня.

Приклад коду для реалізації черги:

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

варіант2:

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

Я рекомендую використовувати option2, оскільки вона трохи швидша за іншу


5

Черга на Java визначається як інтерфейс, і багато готових до використання реалізацій є частиною випуску JDK. Ось деякі з них: LinkedList , черговість з пріоритетом, черга ArrayBlockingQue, ConcurrentLinkedQueue, черга передачі передач, синхронна черга тощо

Так Ви можете створити будь-який із цих класів і потримати його як посилання на чергу. наприклад

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

Ви також можете реалізувати власний користувальницький інтерфейс реалізації черги.


4

Queueце інтерфейс у Java, ви не могли цього зробити. спробуйте:

Queue<Integer> Q = new LinkedList<Integer>();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.