--- jsr166/src/main/java/util/ArrayDeque.java 2005/04/26 19:54:03 1.7 +++ jsr166/src/main/java/util/ArrayDeque.java 2005/05/17 06:36:47 1.11 @@ -18,7 +18,7 @@ import java.io.*; *
Most ArrayDeque operations run in amortized constant time. * Exceptions include {@link #remove(Object) remove}, {@link * #removeFirstOccurrence removeFirstOccurrence}, {@link #removeLastOccurrence - * removeLastOccurrence}, {@link #contains contains }, {@link #iterator + * removeLastOccurrence}, {@link #contains contains}, {@link #iterator * iterator.remove()}, and the bulk operations, all of which run in linear * time. * @@ -40,10 +40,12 @@ import java.io.*; * should be used only to detect bugs. * *
This class and its iterator implement all of the - * optional methods of the {@link Collection} and {@link - * Iterator} interfaces. This class is a member of the Java Collections - * Framework. + * optional methods of the {@link Collection} and {@link + * Iterator} interfaces. + * + *
This class is a member of the
+ *
+ * Java Collections Framework.
*
* @author Josh Bloch and Doug Lea
* @since 1.6
@@ -88,7 +90,7 @@ public class ArrayDeque This method is equivalent to {@link #offerLast}.
- *
- * @param e the element to insert
- * @return true (as per the spec for {@link Queue#offer})
- * @throws NullPointerException if e is null
- */
- public boolean offer(E e) {
- return offerLast(e);
- }
-
- /**
- * Inserts the specified element at the end of this deque.
- *
* This method is equivalent to {@link #addLast}.
*
- * @param e the element to insert
+ * @param e the element to add
* @return true (as per the spec for {@link Collection#add})
- * @throws NullPointerException if e is null
+ * @throws NullPointerException if the specified element is null
*/
public boolean add(E e) {
addLast(e);
@@ -436,61 +380,73 @@ public class ArrayDeque This method is equivalent to {@link #pollFirst}.
+ * This method is equivalent to {@link #offerLast}.
*
- * @return the first element of this deque, or null if
- * this deque is empty
+ * @param e the element to add
+ * @return true (as per the spec for {@link Queue#offer})
+ * @throws NullPointerException if the specified element is null
*/
- public E poll() {
- return pollFirst();
+ public boolean offer(E e) {
+ return offerLast(e);
}
/**
* Retrieves and removes the head of the queue represented by this deque.
- * This method differs from the poll method in that it throws an
+ * This method differs from {@link #poll} only in that it throws an
* exception if this deque is empty.
*
* This method is equivalent to {@link #removeFirst}.
*
* @return the head of the queue represented by this deque
- * @throws NoSuchElementException if this deque is empty
+ * @throws NoSuchElementException {@inheritDoc}
*/
public E remove() {
return removeFirst();
}
/**
- * Retrieves, but does not remove, the head of the queue represented by
- * this deque, returning null if this deque is empty.
+ * Retrieves and removes the head of the queue represented by this deque
+ * (in other words, the first element of this deque), or returns
+ * null if this deque is empty.
*
- * This method is equivalent to {@link #peekFirst}
+ * This method is equivalent to {@link #pollFirst}.
*
* @return the head of the queue represented by this deque, or
- * null if this deque is empty
+ * null if this deque is empty
*/
- public E peek() {
- return peekFirst();
+ public E poll() {
+ return pollFirst();
}
/**
* Retrieves, but does not remove, the head of the queue represented by
- * this deque. This method differs from the peek method only in
- * that it throws an exception if this deque is empty.
+ * this deque. This method differs from {@link #peek} only in that it
+ * throws an exception if this deque is empty.
*
- * This method is equivalent to {@link #getFirst}
+ * This method is equivalent to {@link #getFirst}.
*
* @return the head of the queue represented by this deque
- * @throws NoSuchElementException if this deque is empty
+ * @throws NoSuchElementException {@inheritDoc}
*/
public E element() {
return getFirst();
}
+ /**
+ * Retrieves, but does not remove, the head of the queue represented by
+ * this deque, or returns null if this deque is empty.
+ *
+ * This method is equivalent to {@link #peekFirst}.
+ *
+ * @return the head of the queue represented by this deque, or
+ * null if this deque is empty
+ */
+ public E peek() {
+ return peekFirst();
+ }
+
// *** Stack methods ***
/**
@@ -500,7 +456,7 @@ public class ArrayDeque This method is equivalent to {@link #addFirst}.
*
* @param e the element to push
- * @throws NullPointerException if e is null
+ * @throws NullPointerException if the specified element is null
*/
public void push(E e) {
addFirst(e);
@@ -513,8 +469,8 @@ public class ArrayDeque This method is equivalent to {@link #removeFirst()}.
*
* @return the element at the front of this deque (which is the top
- * of the stack represented by this deque)
- * @throws NoSuchElementException if this deque is empty
+ * of the stack represented by this deque)
+ * @throws NoSuchElementException {@inheritDoc}
*/
public E pop() {
return removeFirst();
@@ -522,21 +478,27 @@ public class ArrayDeque This method is called delete rather than remove to emphasize
- * that its semantics differ from those of List.remove(int).
+ * that its semantics differ from those of {@link List#remove(int)}.
*
* @return true if elements moved backwards
*/
private boolean delete(int i) {
+ int mask = elements.length - 1;
+
+ // Invariant: head <= i < tail mod circularity
+ if (((i - head) & mask) >= ((tail - head) & mask))
+ throw new ConcurrentModificationException();
+
// Case 1: Deque doesn't wrap
// Case 2: Deque does wrap and removed element is in the head portion
- if ((head < tail || tail == 0) || i >= head) {
+ if (i >= head) {
System.arraycopy(elements, head, elements, head + 1, i - head);
elements[head] = null;
- head = (head + 1) & (elements.length - 1);
+ head = (head + 1) & mask;
return false;
}
@@ -559,9 +521,9 @@ public class ArrayDeque
+ * Returns true if this deque contains no elements.
*
- * @return true if this deque contains no elements.
+ * @return true if this deque contains no elements
*/
public boolean isEmpty() {
return head == tail;
@@ -625,10 +587,9 @@ public class ArrayDeque This method is equivalent to {@link #removeFirstOccurrence}.
*
- * @param e element to be removed from this deque, if present
+ * @param o element to be removed from this deque, if present
* @return true if this deque contained the specified element
*/
- public boolean remove(Object e) {
- return removeFirstOccurrence(e);
+ public boolean remove(Object o) {
+ return removeFirstOccurrence(o);
}
/**
@@ -672,38 +639,63 @@ public class ArrayDeque The returned array will be "safe" in that no references to it are
+ * maintained by this deque. (In other words, this method must allocate
+ * a new array). The caller is thus free to modify the returned array.
+ *
+ * This method acts as bridge between array-based and collection-based
+ * APIs.
*
* @return an array containing all of the elements in this deque
- * in the correct order
*/
public Object[] toArray() {
return copyElements(new Object[size()]);
}
/**
- * Returns an array containing all of the elements in this deque in the
- * correct order; the runtime type of the returned array is that of the
- * specified array. If the deque fits in the specified array, it is
- * returned therein. Otherwise, a new array is allocated with the runtime
- * type of the specified array and the size of this deque.
- *
- * If the deque fits in the specified array with room to spare (i.e.,
- * the array has more elements than the deque), the element in the array
- * immediately following the end of the collection is set to null.
+ * Returns an array containing all of the elements in this deque in
+ * proper sequence (from first to last element); the runtime type of the
+ * returned array is that of the specified array. If the deque fits in
+ * the specified array, it is returned therein. Otherwise, a new array
+ * is allocated with the runtime type of the specified array and the
+ * size of this deque.
+ *
+ * If this deque fits in the specified array with room to spare
+ * (i.e., the array has more elements than this deque), the element in
+ * the array immediately following the end of the deque is set to
+ * null.
+ *
+ * Like the {@link #toArray()} method, this method acts as bridge between
+ * array-based and collection-based APIs. Further, this method allows
+ * precise control over the runtime type of the output array, and may,
+ * under certain circumstances, be used to save allocation costs.
+ *
+ * Suppose x is a deque known to contain only strings.
+ * The following code can be used to dump the deque into a newly
+ * allocated array of String:
+ *
+ *
+ * String[] y = x.toArray(new String[0]);
+ *
+ * Note that toArray(new Object[0]) is identical in function to
+ * toArray().
*
* @param a the array into which the elements of the deque are to
- * be stored, if it is big enough; otherwise, a new array of the
- * same runtime type is allocated for this purpose
- * @return an array containing the elements of the deque
- * @throws ArrayStoreException if the runtime type of a is not a supertype
- * of the runtime type of every element in this deque
+ * be stored, if it is big enough; otherwise, a new array of the
+ * same runtime type is allocated for this purpose
+ * @return an array containing all of the elements in this deque
+ * @throws ArrayStoreException if the runtime type of the specified array
+ * is not a supertype of the runtime type of every element in
+ * this deque
+ * @throws NullPointerException if the specified array is null
*/
public