blob: 7ccc6f4a19f7f7ca5818f333d752cb9251acc3ff [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.util;
/**
* A kind of collection that can insert or remove element at both ends("double
* ended queue"). Mostly a deque has no limit of its size.
*
* <p>Extending from Queue, a deque can be used as a Queue which behavior is
* first-in-first-out. Furthermore, a deque can also be used as a Stack(legacy
* class) which behavior is last-in-first-out.
*
* <p>A typical deque does not allow null to be inserted as its element, while some
* implementations allow it. But null should not be inserted even in these
* implementations, since method poll return null to indicate that there is no
* element left in the deque.
*
* <p>A deque can also remove interior elements by removeFirstOccurrence and
* removeLastOccurrence methods. A deque can not access elements by index.
*
* @param <E>
* the type of elements in this collection
* @since 1.6
*/
public interface Deque<E> extends Queue<E> {
/**
* Inserts an element at the head of this deque if it dose not violate size
* limit immediately. It is better to use offerFirst(E) if a deque is
* size-limited.
*
* @param e
* the element
* @throws IllegalStateException
* if it can not add now due to size limit
* @throws ClassCastException
* if the class of element can not be added into this deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
* @throws IllegalArgumentException
* if the element can not be added due to some property.
*/
void addFirst(E e);
/**
* Inserts an element at the tail of this deque if it dose not violate size
* limit immediately. It is better to use offerLast(E) if a deque is
* size-limited.
*
* @param e
* the element
* @throws IllegalStateException
* if it can not add now due to size limit
* @throws ClassCastException
* if the class of element can not be added into this deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
* @throws IllegalArgumentException
* if the element can not be added due to some property.
*/
void addLast(E e);
/**
* Inserts an element at the head of this deque unless it would violate size
* limit. It is better than the addFirst(E) method in a size-limited deque,
* because the latter one may fail to add the element only by throwing an
* exception.
*
* @param e
* the element
* @return true if the operation succeeds or false if it fails.
* @throws ClassCastException
* if the class of element can not be added into this deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
* @throws IllegalArgumentException
* if the element can not be added due to some property.
*/
boolean offerFirst(E e);
/**
* Inserts an element at the tail of this deque unless it would violate size
* limit. It is better than the addLast(E) method in a size-limited deque,
* because the latter one may fail to add the element only by throwing an
* exception.
*
* @param e
* the element
* @return true if the operation succeeds or false if it fails
* @throws ClassCastException
* if the class of element can not be added into this deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
* @throws IllegalArgumentException
* if the element can not be added due to some property
*/
boolean offerLast(E e);
/**
* Gets and removes the head element of this deque. This method throws an
* exception if the deque is empty.
*
* @return the head element
* @throws NoSuchElementException
* if the deque is empty
*/
E removeFirst();
/**
* Gets and removes the tail element of this deque. This method throws an
* exception if the deque is empty.
*
* @return the tail element
* @throws NoSuchElementException
* if the deque is empty
*/
E removeLast();
/**
* Gets and removes the head element of this deque. This method returns null
* if the deque is empty.
*
* @return the head element or null if the deque is empty
*/
E pollFirst();
/**
* Gets and removes the tail element of this deque. This method returns null
* if the deque is empty.
*
* @return the tail element or null if the deque is empty
*/
E pollLast();
/**
* Gets but not removes the head element of this deque. This method throws
* an exception if the deque is empty.
*
* @return the head element
* @throws NoSuchElementException
* if the deque is empty
*/
E getFirst();
/**
* Gets but not removes the tail element of this deque. This method throws
* an exception if the deque is empty.
*
* @return the tail element
* @throws NoSuchElementException
* if the deque is empty
*/
E getLast();
/**
* Gets but not removes the head element of this deque. This method returns
* null if the deque is empty.
*
* @return the head element or null if the deque is empty
*/
E peekFirst();
/**
* Gets but not removes the tail element of this deque. This method returns
* null if the deque is empty.
*
* @return the tail element or null if the deque is empty
*/
E peekLast();
/**
* Removes the first equivalent element of the specified object. If the
* deque does not contain the element, it is unchanged and returns false.
*
* @param o
* the element to be removed
* @return true if the operation succeeds or false if the deque does not
* contain the element.
* @throws ClassCastException
* if the class of the element is incompatible with the deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
*/
boolean removeFirstOccurrence(Object o);
/**
* Removes the last equivalent element of the specified object. If the deque
* does not contain the element, it is unchanged and returns false.
*
* @param o
* the element to be removed
* @return true if the operation succeeds or false if the deque does not
* contain the element.
* @throws ClassCastException
* if the class of the element is incompatible with the deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
*/
boolean removeLastOccurrence(Object o);
/**
* Pushes the element to the deque(at the head of the deque), just same as
* addFirst(E).
*
* @param e
* the element
* @throws IllegalStateException
* if it can not add now due to size limit
* @throws ClassCastException
* if the class of element can not be added into this deque
* @throws NullPointerException
* if the element is null and the deque can not contain null
* element
* @throws IllegalArgumentException
* if the element can not be added due to some property.
*/
void push(E e);
/**
* Pops the head element of the deque, just same as removeFirst().
*
* @return the head element
* @throws NoSuchElementException
* if the deque is empty
*/
E pop();
/**
* Returns the iterator in reverse order, from tail to head.
*
* @return the iterator in reverse order
*/
Iterator<E> descendingIterator();
}