Где находится класс Queue в коллекциях Java? - PullRequest
22 голосов
/ 30 апреля 2009

Я вижу только интерфейс Queue, нет класса Queue в коллекциях Java?

Ответы [ 9 ]

35 голосов
/ 30 апреля 2009

Javadocs дают список классов, которые реализуют Queue.

Все известные классы реализации:

AbstractQueue , ArrayBlockingQueue , ArrayDeque , ConcurrentLinkedQueue , ЗадержкаQueue , LinkedBlockingQueue, LinkedBlockingDeque , LinkedList , PriorityBlockingQueue , PriorityQueue , SynchronousQueue

Есть также несколько подинтерфейсов, которые могут оказаться полезными:

Все известные подинтерфейсы:

BlockingDeque , BlockingQueue , Deque

10 голосов
/ 30 апреля 2009

Очередь имеет несколько реализаций: из API:

Все известные классы реализации:

AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, 
DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, 
PriorityBlockingQueue, PriorityQueue, SynchronousQueue

Обратите внимание, что AbstractQueue не является конкретным классом.

Некоторые из них происходят из пакета одновременно, поэтому, если вы реализуете очередь заданий или что-то подобное, вы должны использовать ConcurrentLinkedQueue или PriorityBlockingQueue (для кучи) для примера.

7 голосов
/ 30 апреля 2009

В документации для Queue перечислены различные реализации, в том числе

Выберите реализацию, которая соответствует вашим потребностям.

3 голосов
/ 16 января 2018
    Queue<Integer> queue = new ArrayDeque<>();

    queue.add(1);
    queue.add(2);
    queue.add(3);

    while (!queue.isEmpty()) {
        System.out.println(queue.remove());// prints 1 2 3
    }

Вы также можете использовать LinkedList. Но обычно для очереди ArrayDeque предпочтительнее LinkedList. Потому что ArrayDeque потребляет меньше памяти, быстрее и не допускает нулевые значения. Недопустимо использовать NULL - это хорошо, потому что если вы разрешаете NULL, тогда, когда вы делаете peek () или poll (), вы можете получить NULL, даже если очередь не пуста.

3 голосов
/ 30 апреля 2009

Помимо использования документов API для поиска «всех известных классов реализации», часто существуют другие непубличные реализации, которые, тем не менее, доступны через общедоступный API (только без использования бессмысленной документации). Если вы нажмете « use », вы также найдете Collections.asLifoQueue (Deque уже Queue, но это FIFO, а не стек).

2 голосов
/ 12 декабря 2012

Нет, класса Queue нет, потому что существует множество различных способов реализации очереди, и вам нужно выбрать тот, который подходит вашему варианту использования. То же самое касается любой другой коллекции в структуре коллекций - например, ArrayList и LinkedList оба реализуют List. Общий шаблон, который является хорошим способом использования наследования объектов:

Интерфейс , например Queue, определяет роль, которую вы хотите, чтобы объект играл;

Подинтерфейсы , например Deque, дополнительно расширяет или специализирует роль - в этом случае «очередь» или двусторонняя очередь позволяет добавлять и удалять элементы с обоих концов очереди, а не только добавлять на заднюю часть и удалять из передний;

Классы обеспечивают реализацию того, как объект выполняет роль. Например, ArrayDeque использует массив с изменяемым размером для реализации двусторонней очереди, которая имеет различные сильные и слабые стороны, чем LinkedList, который использует связанный список.

Чтобы развить идею интерфейса как роли, отметим, что, хотя ArrayDeque реализует Deque, вы можете использовать его как Queue, не беспокоясь об этом, поскольку реализация обоих интерфейсов означает, что он может играть обе роли. Точно так же, LinkedList может носить шляпу List, Queue или Deque.

По этой причине обычный (рекомендуемый) способ использования чего-либо, подобного платформе Collections, - это программирование интерфейса , то есть использование интерфейса при использовании класса, а не самого имени класса. Например, вы могли бы создать объект, подобный этому:

Queue<String> logQueue = new ConcurrentLinkedQueue<String>();
...
logQueue.add("Log message");

Таким образом, вы

  • не привязан к определенному классу и может использовать замену в случае необходимости, без необходимости большого изменения кода, и
  • документируют, что вы делаете с классом, называя его роль. Общий принцип, с которым это помогает, - самодокументируемый код , который, по сути, позволяет самому коду быть понятным без использования комментариев и т. Д.
2 голосов
/ 30 апреля 2009

Хотя ответы кажутся пренебрежительными, на самом деле они довольно крутые, обучая вас ловить рыбу. Очередь - это просто способ посмотреть на коллекцию, поэтому многие коллекции могут реализовать ее. Кроме того, вещи, которые действуют как коллекции, но с определенной другой логикой (например, очереди потоков), могут использовать тот же интерфейс.

Знание, где искать javadocs, - большая помощь. Я уверен, что вы смотрели, но просто не думали смотреть на реализации. Живи и учись.

Иногда вам, возможно, придется искать списки подклассов / расширений. Как если бы вы посмотрели на Queue и увидели AbstractQueue, вы можете посмотреть, какие классы реализуют это.

Я избавлюсь от одного из твоих -1 для тебя :)

2 голосов
/ 30 апреля 2009

http://java.sun.com/javase/6/docs/api/java/util/Queue.html - см. Раздел «Все известные классы реализации». Существует множество реализаций, которые подходят для разных целей.

0 голосов
/ 22 мая 2010
import java.util.Queue;

только что

Enqueue function == Queue_Object.add(input_value);

Dequeue function == Queue_Object.pull();   //return the value and delete it from queue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...