1 /*
   2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.  Oracle designates this
   7  * particular file as subject to the "Classpath" exception as provided
   8  * by Oracle in the LICENSE file that accompanied this code.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  */
  24 
  25 /*
  26  * This file is available under and governed by the GNU General Public
  27  * License version 2 only, as published by the Free Software Foundation.
  28  * However, the following notice accompanied the original version of this
  29  * file:
  30  *
  31  * Written by Doug Lea with assistance from members of JCP JSR-166
  32  * Expert Group and released to the public domain, as explained at
  33  * http://creativecommons.org/publicdomain/zero/1.0/
  34  */
  35 
  36 package java.util;
  37 
  38 /**
  39  * A collection designed for holding elements prior to processing.
  40  * Besides basic {@link Collection} operations, queues provide
  41  * additional insertion, extraction, and inspection operations.
  42  * Each of these methods exists in two forms: one throws an exception
  43  * if the operation fails, the other returns a special value (either
  44  * {@code null} or {@code false}, depending on the operation).  The
  45  * latter form of the insert operation is designed specifically for
  46  * use with capacity-restricted {@code Queue} implementations; in most
  47  * implementations, insert operations cannot fail.
  48  *
  49  * <table class="plain">
  50  * <caption>Summary of Queue methods</caption>
  51  *  <tr>
  52  *    <td></td>
  53  *    <td style="text-align:center"><em>Throws exception</em></td>
  54  *    <td style="text-align:center"><em>Returns special value</em></td>
  55  *  </tr>
  56  *  <tr>
  57  *    <td><b>Insert</b></td>
  58  *    <td>{@link #add(Object) add(e)}</td>
  59  *    <td>{@link #offer(Object) offer(e)}</td>
  60  *  </tr>
  61  *  <tr>
  62  *    <td><b>Remove</b></td>
  63  *    <td>{@link #remove() remove()}</td>
  64  *    <td>{@link #poll() poll()}</td>
  65  *  </tr>
  66  *  <tr>
  67  *    <td><b>Examine</b></td>
  68  *    <td>{@link #element() element()}</td>
  69  *    <td>{@link #peek() peek()}</td>
  70  *  </tr>
  71  * </table>
  72  *
  73  * <p>Queues typically, but do not necessarily, order elements in a
  74  * FIFO (first-in-first-out) manner.  Among the exceptions are
  75  * priority queues, which order elements according to a supplied
  76  * comparator, or the elements' natural ordering, and LIFO queues (or
  77  * stacks) which order the elements LIFO (last-in-first-out).
  78  * Whatever the ordering used, the <em>head</em> of the queue is that
  79  * element which would be removed by a call to {@link #remove()} or
  80  * {@link #poll()}.  In a FIFO queue, all new elements are inserted at
  81  * the <em>tail</em> of the queue. Other kinds of queues may use
  82  * different placement rules.  Every {@code Queue} implementation
  83  * must specify its ordering properties.
  84  *
  85  * <p>The {@link #offer offer} method inserts an element if possible,
  86  * otherwise returning {@code false}.  This differs from the {@link
  87  * java.util.Collection#add Collection.add} method, which can fail to
  88  * add an element only by throwing an unchecked exception.  The
  89  * {@code offer} method is designed for use when failure is a normal,
  90  * rather than exceptional occurrence, for example, in fixed-capacity
  91  * (or &quot;bounded&quot;) queues.
  92  *
  93  * <p>The {@link #remove()} and {@link #poll()} methods remove and
  94  * return the head of the queue.
  95  * Exactly which element is removed from the queue is a
  96  * function of the queue's ordering policy, which differs from
  97  * implementation to implementation. The {@code remove()} and
  98  * {@code poll()} methods differ only in their behavior when the
  99  * queue is empty: the {@code remove()} method throws an exception,
 100  * while the {@code poll()} method returns {@code null}.
 101  *
 102  * <p>The {@link #element()} and {@link #peek()} methods return, but do
 103  * not remove, the head of the queue.
 104  *
 105  * <p>The {@code Queue} interface does not define the <i>blocking queue
 106  * methods</i>, which are common in concurrent programming.  These methods,
 107  * which wait for elements to appear or for space to become available, are
 108  * defined in the {@link java.util.concurrent.BlockingQueue} interface, which
 109  * extends this interface.
 110  *
 111  * <p>{@code Queue} implementations generally do not allow insertion
 112  * of {@code null} elements, although some implementations, such as
 113  * {@link LinkedList}, do not prohibit insertion of {@code null}.
 114  * Even in the implementations that permit it, {@code null} should
 115  * not be inserted into a {@code Queue}, as {@code null} is also
 116  * used as a special return value by the {@code poll} method to
 117  * indicate that the queue contains no elements.
 118  *
 119  * <p>{@code Queue} implementations generally do not define
 120  * element-based versions of methods {@code equals} and
 121  * {@code hashCode} but instead inherit the identity based versions
 122  * from class {@code Object}, because element-based equality is not
 123  * always well-defined for queues with the same elements but different
 124  * ordering properties.
 125  *
 126  * <p>This interface is a member of the
 127  * <a href="{@docRoot}/java/util/package-summary.html#CollectionsFramework">
 128  * Java Collections Framework</a>.
 129  *
 130  * @since 1.5
 131  * @author Doug Lea
 132  * @param <E> the type of elements held in this queue
 133  */
 134 public interface Queue<E> extends Collection<E> {
 135     /**
 136      * Inserts the specified element into this queue if it is possible to do so
 137      * immediately without violating capacity restrictions, returning
 138      * {@code true} upon success and throwing an {@code IllegalStateException}
 139      * if no space is currently available.
 140      *
 141      * @param e the element to add
 142      * @return {@code true} (as specified by {@link Collection#add})
 143      * @throws IllegalStateException if the element cannot be added at this
 144      *         time due to capacity restrictions
 145      * @throws ClassCastException if the class of the specified element
 146      *         prevents it from being added to this queue
 147      * @throws NullPointerException if the specified element is null and
 148      *         this queue does not permit null elements
 149      * @throws IllegalArgumentException if some property of this element
 150      *         prevents it from being added to this queue
 151      */
 152     boolean add(E e);
 153 
 154     /**
 155      * Inserts the specified element into this queue if it is possible to do
 156      * so immediately without violating capacity restrictions.
 157      * When using a capacity-restricted queue, this method is generally
 158      * preferable to {@link #add}, which can fail to insert an element only
 159      * by throwing an exception.
 160      *
 161      * @param e the element to add
 162      * @return {@code true} if the element was added to this queue, else
 163      *         {@code false}
 164      * @throws ClassCastException if the class of the specified element
 165      *         prevents it from being added to this queue
 166      * @throws NullPointerException if the specified element is null and
 167      *         this queue does not permit null elements
 168      * @throws IllegalArgumentException if some property of this element
 169      *         prevents it from being added to this queue
 170      */
 171     boolean offer(E e);
 172 
 173     /**
 174      * Retrieves and removes the head of this queue.  This method differs
 175      * from {@link #poll() poll()} only in that it throws an exception if
 176      * this queue is empty.
 177      *
 178      * @return the head of this queue
 179      * @throws NoSuchElementException if this queue is empty
 180      */
 181     E remove();
 182 
 183     /**
 184      * Retrieves and removes the head of this queue,
 185      * or returns {@code null} if this queue is empty.
 186      *
 187      * @return the head of this queue, or {@code null} if this queue is empty
 188      */
 189     E poll();
 190 
 191     /**
 192      * Retrieves, but does not remove, the head of this queue.  This method
 193      * differs from {@link #peek peek} only in that it throws an exception
 194      * if this queue is empty.
 195      *
 196      * @return the head of this queue
 197      * @throws NoSuchElementException if this queue is empty
 198      */
 199     E element();
 200 
 201     /**
 202      * Retrieves, but does not remove, the head of this queue,
 203      * or returns {@code null} if this queue is empty.
 204      *
 205      * @return the head of this queue, or {@code null} if this queue is empty
 206      */
 207     E peek();
 208 }