Spec-Zone .ru
спецификации, руководства, описания, API
|
A Queue
набор для содержания элементов до обработки. Помимо основного Collection
операции, очереди обеспечивают дополнительную вставку, удаление, и инспекционные операции. Queue
интерфейс следует.
public interface Queue<E> extends Collection<E> { E element(); boolean offer(E e); E peek(); E poll(); E remove(); }
Каждый Queue
метод существует в двух формах: (1) каждый выдает исключение, если работа перестала работать, и (2) другие возвраты специальное значение, если работа перестала работать (также null
или false
, В зависимости от работы). Регулярная структура интерфейса иллюстрируется в следующей таблице.
Тип Работы | Выдает исключение | Возвраты специальное значение |
---|---|---|
Вставить | add(e) |
offer(e) |
Удалить | remove() |
poll() |
Исследовать | element() |
peek() |
Очереди обычно, но не обязательно, упорядочивают элементы в FIFO (первым прибыл - первым убыл) способ. Среди исключений приоритетные очереди, которые упорядочивают элементы согласно их значениям — см. remove
или poll
. В очереди FIFO все новые элементы вставляются в хвосте очереди. Другие виды очередей могут использовать различные правила размещения. Каждый Queue
реализация должна определить свои свойства упорядочивания.
Это возможно для a Queue
реализация, чтобы ограничить число элементов, которое это содержит; такие очереди известны как ограничено. Некоторые Queue
реализации в java.util.concurrent
ограничиваются, но реализации в java.util
не.
add
метод, который Queue
наследовался от Collection
, вставляет элемент, если он не нарушил бы ограничения емкости очереди, когда он бросает IllegalStateException
. offer
метод, который предназначается исключительно для использования на ограниченных очередях, отличается от add
только в этом это указывает на отказ вставить элемент, возвращаясь false
.
remove
и poll
методы и удаляют и возвращают главу очереди. Точно то, какой элемент удаляется, является функцией политики упорядочивания очереди. remove
и poll
методы отличаются по своему поведению только, когда очередь пуста. При этих обстоятельствах, remove
броски NoSuchElementException
, в то время как poll
возвраты null
.
element
и peek
возврат методов, но не удаляют, глава очереди. Они отличаются от друг друга по точно тому же самому виду как remove
и poll
: Если очередь пуста, element
броски NoSuchElementException
, в то время как peek
возвраты null
.
Queue
реализации обычно не позволяют вставку null
элементы. LinkedList
реализация, которая была retrofitted, чтобы реализовать Queue
, исключение. По историческим причинам это разрешает null
элементы, но следует воздержаться от использования в своих интересах этого, потому что null
используется в качестве специального возвращаемого значения poll
и peek
методы.
Реализации очереди обычно не определяют основанные на элементе версии equals
и hashCode
методы, но вместо этого наследовали основанные на идентификационных данных версии от Object
.
Queue
интерфейс не определяет методы очереди блокирования, которые распространены в параллельном программировании. Эти методы, которые ожидают элементов, чтобы появиться или пространства, чтобы стать доступными, определяются в интерфейсе java.util.concurrent.BlockingQueue
, который расширяется Queue
.
В следующем примере программы очередь используется, чтобы реализовать таймер обратного отсчета. Очередь предварительно загружается со всеми целочисленными значениями от числа, определенного на командной строке, чтобы обнулить в порядке убывания. Затем, значения удаляются из очереди и печатаются в односекундных интервалах. Программа искусственна в этом, было бы более естественно сделать ту же самую вещь, не используя очередь, но это иллюстрирует использование очереди, чтобы сохранить элементы до последующей обработки.
import java.util.*; public class Countdown { public static void main(String[] args) throws InterruptedException { int time = Integer.parseInt(args[0]); Queue<Integer> queue = new LinkedList<Integer>(); for (int i = time; i >= 0; i--) queue.add(i); while (!queue.isEmpty()) { System.out.println(queue.remove()); Thread.sleep(1000); } } }
В следующем примере приоритетная очередь используется, чтобы сортировать набор элементов. Снова эта программа искусственна в этом нет никакой причины использовать ее в пользу sort
метод, обеспеченный в Collections
, но это иллюстрирует поведение приоритетных очередей.
static <E> List<E> heapSort(Collection<E> c) { Queue<E> queue = new PriorityQueue<E>(c); List<E> result = new ArrayList<E>(); while (!queue.isEmpty()) result.add(queue.remove()); return result; }