• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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      */
addFirst(E e)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      */
addLast(E e)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      */
offerFirst(E e)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      */
offerLast(E e)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      */
removeFirst()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      */
removeLast()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      */
pollFirst()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      */
pollLast()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      */
getFirst()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      */
getLast()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      */
peekFirst()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      */
peekLast()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      */
removeFirstOccurrence(Object o)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      */
removeLastOccurrence(Object o)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      */
add(E e)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      */
offer(E e)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      */
remove()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      */
poll()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      */
element()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      */
peek()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      */
push(E e)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      */
pop()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      */
remove(Object o)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      */
contains(Object o)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      */
size()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      */
iterator()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      */
descendingIterator()577     Iterator<E> descendingIterator();
578 
579 }
580