--- jsr166/src/main/java/util/PriorityQueue.java 2008/05/18 23:47:56 1.68
+++ jsr166/src/main/java/util/PriorityQueue.java 2013/01/16 01:59:47 1.80
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2006 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -18,9 +18,9 @@
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
*/
package java.util;
@@ -56,14 +56,14 @@ package java.util;
* the priority queue in any particular order. If you need ordered
* traversal, consider using {@code Arrays.sort(pq.toArray())}.
*
- *
Note that this implementation is not synchronized.
+ *
Note that this implementation is not synchronized.
* Multiple threads should not access a {@code PriorityQueue}
* instance concurrently if any of the threads modifies the queue.
* Instead, use the thread-safe {@link
* java.util.concurrent.PriorityBlockingQueue} class.
*
*
Implementation note: this implementation provides
- * O(log(n)) time for the enqueing and dequeing methods
+ * O(log(n)) time for the enqueuing and dequeuing methods
* ({@code offer}, {@code poll}, {@code remove()} and {@code add});
* linear time for the {@code remove(Object)} and {@code contains(Object)}
* methods; and constant time for the retrieval methods
@@ -74,10 +74,10 @@ package java.util;
* Java Collections Framework.
*
* @since 1.5
- * @version %I%, %G%
* @author Josh Bloch, Doug Lea
* @param the type of elements held in this collection
*/
+@SuppressWarnings("unchecked")
public class PriorityQueue extends AbstractQueue
implements java.io.Serializable {
@@ -171,17 +171,21 @@ public class PriorityQueue extends Ab
* @throws NullPointerException if the specified collection or any
* of its elements are null
*/
+ @SuppressWarnings("unchecked")
public PriorityQueue(Collection extends E> c) {
- initFromCollection(c);
- if (c instanceof SortedSet)
- comparator = (Comparator super E>)
- ((SortedSet extends E>)c).comparator();
- else if (c instanceof PriorityQueue)
- comparator = (Comparator super E>)
- ((PriorityQueue extends E>)c).comparator();
+ if (c instanceof SortedSet>) {
+ SortedSet extends E> ss = (SortedSet extends E>) c;
+ this.comparator = (Comparator super E>) ss.comparator();
+ initElementsFromCollection(ss);
+ }
+ else if (c instanceof PriorityQueue>) {
+ PriorityQueue extends E> pq = (PriorityQueue extends E>) c;
+ this.comparator = (Comparator super E>) pq.comparator();
+ initFromPriorityQueue(pq);
+ }
else {
- comparator = null;
- heapify();
+ this.comparator = null;
+ initFromCollection(c);
}
}
@@ -199,9 +203,10 @@ public class PriorityQueue extends Ab
* @throws NullPointerException if the specified priority queue or any
* of its elements are null
*/
+ @SuppressWarnings("unchecked")
public PriorityQueue(PriorityQueue extends E> c) {
- comparator = (Comparator super E>)c.comparator();
- initFromCollection(c);
+ this.comparator = (Comparator super E>) c.comparator();
+ initFromPriorityQueue(c);
}
/**
@@ -217,9 +222,33 @@ public class PriorityQueue extends Ab
* @throws NullPointerException if the specified sorted set or any
* of its elements are null
*/
+ @SuppressWarnings("unchecked")
public PriorityQueue(SortedSet extends E> c) {
- comparator = (Comparator super E>)c.comparator();
- initFromCollection(c);
+ this.comparator = (Comparator super E>) c.comparator();
+ initElementsFromCollection(c);
+ }
+
+ private void initFromPriorityQueue(PriorityQueue extends E> c) {
+ if (c.getClass() == PriorityQueue.class) {
+ this.queue = c.toArray();
+ this.size = c.size();
+ } else {
+ initFromCollection(c);
+ }
+ }
+
+ private void initElementsFromCollection(Collection extends E> c) {
+ Object[] a = c.toArray();
+ // If c.toArray incorrectly doesn't return Object[], copy it.
+ if (a.getClass() != Object[].class)
+ a = Arrays.copyOf(a, a.length, Object[].class);
+ int len = a.length;
+ if (len == 1 || this.comparator != null)
+ for (int i = 0; i < len; i++)
+ if (a[i] == null)
+ throw new NullPointerException();
+ this.queue = a;
+ this.size = a.length;
}
/**
@@ -228,34 +257,43 @@ public class PriorityQueue extends Ab
* @param c the collection
*/
private void initFromCollection(Collection extends E> c) {
- Object[] a = c.toArray();
- // If c.toArray incorrectly doesn't return Object[], copy it.
- if (a.getClass() != Object[].class)
- a = Arrays.copyOf(a, a.length, Object[].class);
- queue = a;
- size = a.length;
+ initElementsFromCollection(c);
+ heapify();
}
/**
+ * The maximum size of array to allocate.
+ * Some VMs reserve some header words in an array.
+ * Attempts to allocate larger arrays may result in
+ * OutOfMemoryError: Requested array size exceeds VM limit
+ */
+ private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
+
+ /**
* Increases the capacity of the array.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
- if (minCapacity < 0) // overflow
- throw new OutOfMemoryError();
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
- int newCapacity = ((oldCapacity < 64)?
- ((oldCapacity + 1) * 2):
- ((oldCapacity / 2) * 3));
- if (newCapacity < 0) // overflow
- newCapacity = Integer.MAX_VALUE;
- if (newCapacity < minCapacity)
- newCapacity = minCapacity;
+ int newCapacity = oldCapacity + ((oldCapacity < 64) ?
+ (oldCapacity + 2) :
+ (oldCapacity >> 1));
+ // overflow-conscious code
+ if (newCapacity - MAX_ARRAY_SIZE > 0)
+ newCapacity = hugeCapacity(minCapacity);
queue = Arrays.copyOf(queue, newCapacity);
}
+ private static int hugeCapacity(int minCapacity) {
+ if (minCapacity < 0) // overflow
+ throw new OutOfMemoryError();
+ return (minCapacity > MAX_ARRAY_SIZE) ?
+ Integer.MAX_VALUE :
+ MAX_ARRAY_SIZE;
+ }
+
/**
* Inserts the specified element into this priority queue.
*
@@ -294,9 +332,7 @@ public class PriorityQueue extends Ab
}
public E peek() {
- if (size == 0)
- return null;
- return (E) queue[0];
+ return (size == 0) ? null : (E) queue[0];
}
private int indexOf(Object o) {
@@ -393,15 +429,14 @@ public class PriorityQueue extends Ab
* 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 queue known to contain only strings.
+ *
Suppose {@code x} is a queue known to contain only strings.
* The following code can be used to dump the queue into a newly
- * allocated array of String:
+ * allocated array of {@code String}:
*
- *
- * String[] y = x.toArray(new String[0]);
+ * {@code String[] y = x.toArray(new String[0]);}
*
- * Note that toArray(new Object[0]) is identical in function to
- * toArray().
+ * Note that {@code toArray(new Object[0])} is identical in function to
+ * {@code toArray()}.
*
* @param a the array into which the elements of the queue are to
* be stored, if it is big enough; otherwise, a new array of the
@@ -555,7 +590,7 @@ public class PriorityQueue extends Ab
* avoid missing traversing elements.
*/
private E removeAt(int i) {
- assert i >= 0 && i < size;
+ // assert i >= 0 && i < size;
modCount++;
int s = --size;
if (s == i) // removed last element
@@ -690,16 +725,14 @@ public class PriorityQueue extends Ab
}
/**
- * Saves the state of the instance to a stream (that
- * is, serializes it).
+ * Saves this queue to a stream (that is, serializes it).
*
* @serialData The length of the array backing the instance is
* emitted (int), followed by all of its elements
* (each an {@code Object}) in the proper order.
- * @param s the stream
*/
private void writeObject(java.io.ObjectOutputStream s)
- throws java.io.IOException{
+ throws java.io.IOException {
// Write out element count, and any hidden stuff
s.defaultWriteObject();
@@ -712,10 +745,7 @@ public class PriorityQueue extends Ab
}
/**
- * Reconstitutes the {@code PriorityQueue} instance from a stream
- * (that is, deserializes it).
- *
- * @param s the stream
+ * Reconstitutes this queue from a stream (that is, deserializes it).
*/
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {