Як створити об'єкт черги в 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.