Home | History | Annotate | Download | only in util
      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 and Josh Bloch with assistance from members of
     32  * JCP JSR-166 Expert Group and released to the public domain, as explained
     33  * at http://creativecommons.org/publicdomain/zero/1.0/
     34  */
     35 
     36 package java.util;
     37 
     38 // Android-changed: removed link to collections framework docs
     39 /**
     40  * A linear collection that supports element insertion and removal at
     41  * both ends.  The name <i>deque</i> is short for "double ended queue"
     42  * and is usually pronounced "deck".  Most {@code Deque}
     43  * implementations place no fixed limits on the number of elements
     44  * they may contain, but this interface supports capacity-restricted
     45  * deques as well as those with no fixed size limit.
     46  *
     47  * <p>This interface defines methods to access the elements at both
     48  * ends of the deque.  Methods are provided to insert, remove, and
     49  * examine the element.  Each of these methods exists in two forms:
     50  * one throws an exception if the operation fails, the other returns a
     51  * special value (either {@code null} or {@code false}, depending on
     52  * the operation).  The latter form of the insert operation is
     53  * designed specifically for use with capacity-restricted
     54  * {@code Deque} implementations; in most implementations, insert
     55  * operations cannot fail.
     56  *
     57  * <p>The twelve methods described above are summarized in the
     58  * following table:
     59  *
     60  * <table BORDER CELLPADDING=3 CELLSPACING=1>
     61  * <caption>Summary of Deque methods</caption>
     62  *  <tr>
     63  *    <td></td>
     64  *    <td ALIGN=CENTER COLSPAN = 2> <b>First Element (Head)</b></td>
     65  *    <td ALIGN=CENTER COLSPAN = 2> <b>Last Element (Tail)</b></td>
     66  *  </tr>
     67  *  <tr>
     68  *    <td></td>
     69  *    <td ALIGN=CENTER><em>Throws exception</em></td>
     70  *    <td ALIGN=CENTER><em>Special value</em></td>
     71  *    <td ALIGN=CENTER><em>Throws exception</em></td>
     72  *    <td ALIGN=CENTER><em>Special value</em></td>
     73  *  </tr>
     74  *  <tr>
     75  *    <td><b>Insert</b></td>
     76  *    <td>{@link Deque#addFirst addFirst(e)}</td>
     77  *    <td>{@link Deque#offerFirst offerFirst(e)}</td>
     78  *    <td>{@link Deque#addLast addLast(e)}</td>
     79  *    <td>{@link Deque#offerLast offerLast(e)}</td>
     80  *  </tr>
     81  *  <tr>
     82  *    <td><b>Remove</b></td>
     83  *    <td>{@link Deque#removeFirst removeFirst()}</td>
     84  *    <td>{@link Deque#pollFirst pollFirst()}</td>
     85  *    <td>{@link Deque#removeLast removeLast()}</td>
     86  *    <td>{@link Deque#pollLast pollLast()}</td>
     87  *  </tr>
     88  *  <tr>
     89  *    <td><b>Examine</b></td>
     90  *    <td>{@link Deque#getFirst getFirst()}</td>
     91  *    <td>{@link Deque#peekFirst peekFirst()}</td>
     92  *    <td>{@link Deque#getLast getLast()}</td>
     93  *    <td>{@link Deque#peekLast peekLast()}</td>
     94  *  </tr>
     95  * </table>
     96  *
     97  * <p>This interface extends the {@link Queue} interface.  When a deque is
     98  * used as a queue, FIFO (First-In-First-Out) behavior results.  Elements are
     99  * added at the end of the deque and removed from the beginning.  The methods
    100  * inherited from the {@code Queue} interface are precisely equivalent to
    101  * {@code Deque} methods as indicated in the following table:
    102  *
    103  * <table BORDER CELLPADDING=3 CELLSPACING=1>
    104  * <caption>Comparison of Queue and Deque methods</caption>
    105  *  <tr>
    106  *    <td ALIGN=CENTER> <b>{@code Queue} Method</b></td>
    107  *    <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
    108  *  </tr>
    109  *  <tr>
    110  *    <td>{@link java.util.Queue#add add(e)}</td>
    111  *    <td>{@link #addLast addLast(e)}</td>
    112  *  </tr>
    113  *  <tr>
    114  *    <td>{@link java.util.Queue#offer offer(e)}</td>
    115  *    <td>{@link #offerLast offerLast(e)}</td>
    116  *  </tr>
    117  *  <tr>
    118  *    <td>{@link java.util.Queue#remove remove()}</td>
    119  *    <td>{@link #removeFirst removeFirst()}</td>
    120  *  </tr>
    121  *  <tr>
    122  *    <td>{@link java.util.Queue#poll poll()}</td>
    123  *    <td>{@link #pollFirst pollFirst()}</td>
    124  *  </tr>
    125  *  <tr>
    126  *    <td>{@link java.util.Queue#element element()}</td>
    127  *    <td>{@link #getFirst getFirst()}</td>
    128  *  </tr>
    129  *  <tr>
    130  *    <td>{@link java.util.Queue#peek peek()}</td>
    131  *    <td>{@link #peek peekFirst()}</td>
    132  *  </tr>
    133  * </table>
    134  *
    135  * <p>Deques can also be used as LIFO (Last-In-First-Out) stacks.  This
    136  * interface should be used in preference to the legacy {@link Stack} class.
    137  * When a deque is used as a stack, elements are pushed and popped from the
    138  * beginning of the deque.  Stack methods are precisely equivalent to
    139  * {@code Deque} methods as indicated in the table below:
    140  *
    141  * <table BORDER CELLPADDING=3 CELLSPACING=1>
    142  * <caption>Comparison of Stack and Deque methods</caption>
    143  *  <tr>
    144  *    <td ALIGN=CENTER> <b>Stack Method</b></td>
    145  *    <td ALIGN=CENTER> <b>Equivalent {@code Deque} Method</b></td>
    146  *  </tr>
    147  *  <tr>
    148  *    <td>{@link #push push(e)}</td>
    149  *    <td>{@link #addFirst addFirst(e)}</td>
    150  *  </tr>
    151  *  <tr>
    152  *    <td>{@link #pop pop()}</td>
    153  *    <td>{@link #removeFirst removeFirst()}</td>
    154  *  </tr>
    155  *  <tr>
    156  *    <td>{@link #peek peek()}</td>
    157  *    <td>{@link #peekFirst peekFirst()}</td>
    158  *  </tr>
    159  * </table>
    160  *
    161  * <p>Note that the {@link #peek peek} method works equally well when
    162  * a deque is used as a queue or a stack; in either case, elements are
    163  * drawn from the beginning of the deque.
    164  *
    165  * <p>This interface provides two methods to remove interior
    166  * elements, {@link #removeFirstOccurrence removeFirstOccurrence} and
    167  * {@link #removeLastOccurrence removeLastOccurrence}.
    168  *
    169  * <p>Unlike the {@link List} interface, this interface does not
    170  * provide support for indexed access to elements.
    171  *
    172  * <p>While {@code Deque} implementations are not strictly required
    173  * to prohibit the insertion of null elements, they are strongly
    174  * encouraged to do so.  Users of any {@code Deque} implementations
    175  * that do allow null elements are strongly encouraged <i>not</i> to
    176  * take advantage of the ability to insert nulls.  This is so because
    177  * {@code null} is used as a special return value by various methods
    178  * to indicated that the deque is empty.
    179  *
    180  * <p>{@code Deque} implementations generally do not define
    181  * element-based versions of the {@code equals} and {@code hashCode}
    182  * methods, but instead inherit the identity-based versions from class
    183  * {@code Object}.
    184  *
    185  * @author Doug Lea
    186  * @author Josh Bloch
    187  * @since  1.6
    188  * @param <E> the type of elements held in this deque
    189  */
    190 // Android-changed: fix framework docs link to "Collection#optional-restrictions"
    191 // Several occurrences of the link have been fixed throughout.
    192 public interface Deque<E> extends Queue<E> {
    193     /**
    194      * Inserts the specified element at the front of this deque if it is
    195      * possible to do so immediately without violating capacity restrictions,
    196      * throwing an {@code IllegalStateException} if no space is currently
    197      * available.  When using a capacity-restricted deque, it is generally
    198      * preferable to use method {@link #offerFirst}.
    199      *
    200      * @param e the element to add
    201      * @throws IllegalStateException if the element cannot be added at this
    202      *         time due to capacity restrictions
    203      * @throws ClassCastException if the class of the specified element
    204      *         prevents it from being added to this deque
    205      * @throws NullPointerException if the specified element is null and this
    206      *         deque does not permit null elements
    207      * @throws IllegalArgumentException if some property of the specified
    208      *         element prevents it from being added to this deque
    209      */
    210     void addFirst(E e);
    211 
    212     /**
    213      * Inserts the specified element at the end of this deque if it is
    214      * possible to do so immediately without violating capacity restrictions,
    215      * throwing an {@code IllegalStateException} if no space is currently
    216      * available.  When using a capacity-restricted deque, it is generally
    217      * preferable to use method {@link #offerLast}.
    218      *
    219      * <p>This method is equivalent to {@link #add}.
    220      *
    221      * @param e the element to add
    222      * @throws IllegalStateException if the element cannot be added at this
    223      *         time due to capacity restrictions
    224      * @throws ClassCastException if the class of the specified element
    225      *         prevents it from being added to this deque
    226      * @throws NullPointerException if the specified element is null and this
    227      *         deque does not permit null elements
    228      * @throws IllegalArgumentException if some property of the specified
    229      *         element prevents it from being added to this deque
    230      */
    231     void addLast(E e);
    232 
    233     /**
    234      * Inserts the specified element at the front of this deque unless it would
    235      * violate capacity restrictions.  When using a capacity-restricted deque,
    236      * this method is generally preferable to the {@link #addFirst} method,
    237      * which can fail to insert an element only by throwing an exception.
    238      *
    239      * @param e the element to add
    240      * @return {@code true} if the element was added to this deque, else
    241      *         {@code false}
    242      * @throws ClassCastException if the class of the specified element
    243      *         prevents it from being added to this deque
    244      * @throws NullPointerException if the specified element is null and this
    245      *         deque does not permit null elements
    246      * @throws IllegalArgumentException if some property of the specified
    247      *         element prevents it from being added to this deque
    248      */
    249     boolean offerFirst(E e);
    250 
    251     /**
    252      * Inserts the specified element at the end of this deque unless it would
    253      * violate capacity restrictions.  When using a capacity-restricted deque,
    254      * this method is generally preferable to the {@link #addLast} method,
    255      * which can fail to insert an element only by throwing an exception.
    256      *
    257      * @param e the element to add
    258      * @return {@code true} if the element was added to this deque, else
    259      *         {@code false}
    260      * @throws ClassCastException if the class of the specified element
    261      *         prevents it from being added to this deque
    262      * @throws NullPointerException if the specified element is null and this
    263      *         deque does not permit null elements
    264      * @throws IllegalArgumentException if some property of the specified
    265      *         element prevents it from being added to this deque
    266      */
    267     boolean offerLast(E e);
    268 
    269     /**
    270      * Retrieves and removes the first element of this deque.  This method
    271      * differs from {@link #pollFirst pollFirst} only in that it throws an
    272      * exception if this deque is empty.
    273      *
    274      * @return the head of this deque
    275      * @throws NoSuchElementException if this deque is empty
    276      */
    277     E removeFirst();
    278 
    279     /**
    280      * Retrieves and removes the last element of this deque.  This method
    281      * differs from {@link #pollLast pollLast} only in that it throws an
    282      * exception if this deque is empty.
    283      *
    284      * @return the tail of this deque
    285      * @throws NoSuchElementException if this deque is empty
    286      */
    287     E removeLast();
    288 
    289     /**
    290      * Retrieves and removes the first element of this deque,
    291      * or returns {@code null} if this deque is empty.
    292      *
    293      * @return the head of this deque, or {@code null} if this deque is empty
    294      */
    295     E pollFirst();
    296 
    297     /**
    298      * Retrieves and removes the last element of this deque,
    299      * or returns {@code null} if this deque is empty.
    300      *
    301      * @return the tail of this deque, or {@code null} if this deque is empty
    302      */
    303     E pollLast();
    304 
    305     /**
    306      * Retrieves, but does not remove, the first element of this deque.
    307      *
    308      * This method differs from {@link #peekFirst peekFirst} only in that it
    309      * throws an exception if this deque is empty.
    310      *
    311      * @return the head of this deque
    312      * @throws NoSuchElementException if this deque is empty
    313      */
    314     E getFirst();
    315 
    316     /**
    317      * Retrieves, but does not remove, the last element of this deque.
    318      * This method differs from {@link #peekLast peekLast} only in that it
    319      * throws an exception if this deque is empty.
    320      *
    321      * @return the tail of this deque
    322      * @throws NoSuchElementException if this deque is empty
    323      */
    324     E getLast();
    325 
    326     /**
    327      * Retrieves, but does not remove, the first element of this deque,
    328      * or returns {@code null} if this deque is empty.
    329      *
    330      * @return the head of this deque, or {@code null} if this deque is empty
    331      */
    332     E peekFirst();
    333 
    334     /**
    335      * Retrieves, but does not remove, the last element of this deque,
    336      * or returns {@code null} if this deque is empty.
    337      *
    338      * @return the tail of this deque, or {@code null} if this deque is empty
    339      */
    340     E peekLast();
    341 
    342     /**
    343      * Removes the first occurrence of the specified element from this deque.
    344      * If the deque does not contain the element, it is unchanged.
    345      * More formally, removes the first element {@code e} such that
    346      * {@code Objects.equals(o, e)} (if such an element exists).
    347      * Returns {@code true} if this deque contained the specified element
    348      * (or equivalently, if this deque changed as a result of the call).
    349      *
    350      * @param o element to be removed from this deque, if present
    351      * @return {@code true} if an element was removed as a result of this call
    352      * @throws ClassCastException if the class of the specified element
    353      *         is incompatible with this deque
    354      * (<a href="Collection.html#optional-restrictions">optional</a>)
    355      * @throws NullPointerException if the specified element is null and this
    356      *         deque does not permit null elements
    357      * (<a href="Collection.html#optional-restrictions">optional</a>)
    358      */
    359     boolean removeFirstOccurrence(Object o);
    360 
    361     /**
    362      * Removes the last occurrence of the specified element from this deque.
    363      * If the deque does not contain the element, it is unchanged.
    364      * More formally, removes the last element {@code e} such that
    365      * {@code Objects.equals(o, e)} (if such an element exists).
    366      * Returns {@code true} if this deque contained the specified element
    367      * (or equivalently, if this deque changed as a result of the call).
    368      *
    369      * @param o element to be removed from this deque, if present
    370      * @return {@code true} if an element was removed as a result of this call
    371      * @throws ClassCastException if the class of the specified element
    372      *         is incompatible with this deque
    373      * (<a href="Collection.html#optional-restrictions">optional</a>)
    374      * @throws NullPointerException if the specified element is null and this
    375      *         deque does not permit null elements
    376      * (<a href="Collection.html#optional-restrictions">optional</a>)
    377      */
    378     boolean removeLastOccurrence(Object o);
    379 
    380     // *** Queue methods ***
    381 
    382     /**
    383      * Inserts the specified element into the queue represented by this deque
    384      * (in other words, at the tail of this deque) if it is possible to do so
    385      * immediately without violating capacity restrictions, returning
    386      * {@code true} upon success and throwing an
    387      * {@code IllegalStateException} if no space is currently available.
    388      * When using a capacity-restricted deque, it is generally preferable to
    389      * use {@link #offer(Object) offer}.
    390      *
    391      * <p>This method is equivalent to {@link #addLast}.
    392      *
    393      * @param e the element to add
    394      * @return {@code true} (as specified by {@link Collection#add})
    395      * @throws IllegalStateException if the element cannot be added at this
    396      *         time due to capacity restrictions
    397      * @throws ClassCastException if the class of the specified element
    398      *         prevents it from being added to this deque
    399      * @throws NullPointerException if the specified element is null and this
    400      *         deque does not permit null elements
    401      * @throws IllegalArgumentException if some property of the specified
    402      *         element prevents it from being added to this deque
    403      */
    404     boolean add(E e);
    405 
    406     /**
    407      * Inserts the specified element into the queue represented by this deque
    408      * (in other words, at the tail of this deque) if it is possible to do so
    409      * immediately without violating capacity restrictions, returning
    410      * {@code true} upon success and {@code false} if no space is currently
    411      * available.  When using a capacity-restricted deque, this method is
    412      * generally preferable to the {@link #add} method, which can fail to
    413      * insert an element only by throwing an exception.
    414      *
    415      * <p>This method is equivalent to {@link #offerLast}.
    416      *
    417      * @param e the element to add
    418      * @return {@code true} if the element was added to this deque, else
    419      *         {@code false}
    420      * @throws ClassCastException if the class of the specified element
    421      *         prevents it from being added to this deque
    422      * @throws NullPointerException if the specified element is null and this
    423      *         deque does not permit null elements
    424      * @throws IllegalArgumentException if some property of the specified
    425      *         element prevents it from being added to this deque
    426      */
    427     boolean offer(E e);
    428 
    429     /**
    430      * Retrieves and removes the head of the queue represented by this deque
    431      * (in other words, the first element of this deque).
    432      * This method differs from {@link #poll poll} only in that it throws an
    433      * exception if this deque is empty.
    434      *
    435      * <p>This method is equivalent to {@link #removeFirst()}.
    436      *
    437      * @return the head of the queue represented by this deque
    438      * @throws NoSuchElementException if this deque is empty
    439      */
    440     E remove();
    441 
    442     /**
    443      * Retrieves and removes the head of the queue represented by this deque
    444      * (in other words, the first element of this deque), or returns
    445      * {@code null} if this deque is empty.
    446      *
    447      * <p>This method is equivalent to {@link #pollFirst()}.
    448      *
    449      * @return the first element of this deque, or {@code null} if
    450      *         this deque is empty
    451      */
    452     E poll();
    453 
    454     /**
    455      * Retrieves, but does not remove, the head of the queue represented by
    456      * this deque (in other words, the first element of this deque).
    457      * This method differs from {@link #peek peek} only in that it throws an
    458      * exception if this deque is empty.
    459      *
    460      * <p>This method is equivalent to {@link #getFirst()}.
    461      *
    462      * @return the head of the queue represented by this deque
    463      * @throws NoSuchElementException if this deque is empty
    464      */
    465     E element();
    466 
    467     /**
    468      * Retrieves, but does not remove, the head of the queue represented by
    469      * this deque (in other words, the first element of this deque), or
    470      * returns {@code null} if this deque is empty.
    471      *
    472      * <p>This method is equivalent to {@link #peekFirst()}.
    473      *
    474      * @return the head of the queue represented by this deque, or
    475      *         {@code null} if this deque is empty
    476      */
    477     E peek();
    478 
    479 
    480     // *** Stack methods ***
    481 
    482     /**
    483      * Pushes an element onto the stack represented by this deque (in other
    484      * words, at the head of this deque) if it is possible to do so
    485      * immediately without violating capacity restrictions, throwing an
    486      * {@code IllegalStateException} if no space is currently available.
    487      *
    488      * <p>This method is equivalent to {@link #addFirst}.
    489      *
    490      * @param e the element to push
    491      * @throws IllegalStateException if the element cannot be added at this
    492      *         time due to capacity restrictions
    493      * @throws ClassCastException if the class of the specified element
    494      *         prevents it from being added to this deque
    495      * @throws NullPointerException if the specified element is null and this
    496      *         deque does not permit null elements
    497      * @throws IllegalArgumentException if some property of the specified
    498      *         element prevents it from being added to this deque
    499      */
    500     void push(E e);
    501 
    502     /**
    503      * Pops an element from the stack represented by this deque.  In other
    504      * words, removes and returns the first element of this deque.
    505      *
    506      * <p>This method is equivalent to {@link #removeFirst()}.
    507      *
    508      * @return the element at the front of this deque (which is the top
    509      *         of the stack represented by this deque)
    510      * @throws NoSuchElementException if this deque is empty
    511      */
    512     E pop();
    513 
    514 
    515     // *** Collection methods ***
    516 
    517     /**
    518      * Removes the first occurrence of the specified element from this deque.
    519      * If the deque does not contain the element, it is unchanged.
    520      * More formally, removes the first element {@code e} such that
    521      * {@code Objects.equals(o, e)} (if such an element exists).
    522      * Returns {@code true} if this deque contained the specified element
    523      * (or equivalently, if this deque changed as a result of the call).
    524      *
    525      * <p>This method is equivalent to {@link #removeFirstOccurrence(Object)}.
    526      *
    527      * @param o element to be removed from this deque, if present
    528      * @return {@code true} if an element was removed as a result of this call
    529      * @throws ClassCastException if the class of the specified element
    530      *         is incompatible with this deque
    531      * (<a href="Collection.html#optional-restrictions">optional</a>)
    532      * @throws NullPointerException if the specified element is null and this
    533      *         deque does not permit null elements
    534      * (<a href="Collection.html#optional-restrictions">optional</a>)
    535      */
    536     boolean remove(Object o);
    537 
    538     /**
    539      * Returns {@code true} if this deque contains the specified element.
    540      * More formally, returns {@code true} if and only if this deque contains
    541      * at least one element {@code e} such that {@code Objects.equals(o, e)}.
    542      *
    543      * @param o element whose presence in this deque is to be tested
    544      * @return {@code true} if this deque contains the specified element
    545      * @throws ClassCastException if the class of the specified element
    546      *         is incompatible with this deque
    547      * (<a href="Collection.html#optional-restrictions">optional</a>)
    548      * @throws NullPointerException if the specified element is null and this
    549      *         deque does not permit null elements
    550      * (<a href="Collection.html#optional-restrictions">optional</a>)
    551      */
    552     boolean contains(Object o);
    553 
    554     /**
    555      * Returns the number of elements in this deque.
    556      *
    557      * @return the number of elements in this deque
    558      */
    559     int size();
    560 
    561     /**
    562      * Returns an iterator over the elements in this deque in proper sequence.
    563      * The elements will be returned in order from first (head) to last (tail).
    564      *
    565      * @return an iterator over the elements in this deque in proper sequence
    566      */
    567     Iterator<E> iterator();
    568 
    569     /**
    570      * Returns an iterator over the elements in this deque in reverse
    571      * sequential order.  The elements will be returned in order from
    572      * last (tail) to first (head).
    573      *
    574      * @return an iterator over the elements in this deque in reverse
    575      * sequence
    576      */
    577     Iterator<E> descendingIterator();
    578 
    579 }
    580