Source Code Cross Referenced for PriorityQueue.java in  » 6.0-JDK-Core » Collections-Jar-Zip-Logging-regex » java » util » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Home
Java Source Code / Java Documentation
1.6.0 JDK Core
2.6.0 JDK Modules
3.6.0 JDK Modules com.sun
4.6.0 JDK Modules com.sun.java
5.6.0 JDK Modules sun
6.6.0 JDK Platform
7.Ajax
8.Apache Harmony Java SE
9.Aspect oriented
10.Authentication Authorization
11.Blogger System
12.Build
13.Byte Code
14.Cache
15.Chart
16.Chat
17.Code Analyzer
18.Collaboration
19.Content Management System
20.Database Client
21.Database DBMS
22.Database JDBC Connection Pool
23.Database ORM
24.Development
25.EJB Server
26.ERP CRM Financial
27.ESB
28.Forum
29.Game
30.GIS
31.Graphic 3D
32.Graphic Library
33.Groupware
34.HTML Parser
35.IDE
36.IDE Eclipse
37.IDE Netbeans
38.Installer
39.Internationalization Localization
40.Inversion of Control
41.Issue Tracking
42.J2EE
43.J2ME
44.JBoss
45.JMS
46.JMX
47.Library
48.Mail Clients
49.Music
50.Net
51.Parser
52.PDF
53.Portal
54.Profiler
55.Project Management
56.Report
57.RSS RDF
58.Rule Engine
59.Science
60.Scripting
61.Search Engine
62.Security
63.Sevlet Container
64.Source Control
65.Swing Library
66.Template Engine
67.Test Coverage
68.Testing
69.UML
70.Web Crawler
71.Web Framework
72.Web Mail
73.Web Server
74.Web Services
75.Web Services apache cxf 2.2.6
76.Web Services AXIS2
77.Wiki Engine
78.Workflow Engines
79.XML
80.XML UI
Java Source Code / Java Documentation » 6.0 JDK Core » Collections Jar Zip Logging regex » java.util 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


001        /*
002         * Copyright 2003-2006 Sun Microsystems, Inc.  All Rights Reserved.
003         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004         *
005         * This code is free software; you can redistribute it and/or modify it
006         * under the terms of the GNU General Public License version 2 only, as
007         * published by the Free Software Foundation.  Sun designates this
008         * particular file as subject to the "Classpath" exception as provided
009         * by Sun in the LICENSE file that accompanied this code.
010         *
011         * This code is distributed in the hope that it will be useful, but WITHOUT
012         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
014         * version 2 for more details (a copy is included in the LICENSE file that
015         * accompanied this code).
016         *
017         * You should have received a copy of the GNU General Public License version
018         * 2 along with this work; if not, write to the Free Software Foundation,
019         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020         *
021         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022         * CA 95054 USA or visit www.sun.com if you need additional information or
023         * have any questions.
024         */
025
026        package java.util;
027
028        /**
029         * An unbounded priority {@linkplain Queue queue} based on a priority heap.
030         * The elements of the priority queue are ordered according to their
031         * {@linkplain Comparable natural ordering}, or by a {@link Comparator}
032         * provided at queue construction time, depending on which constructor is
033         * used.  A priority queue does not permit {@code null} elements.
034         * A priority queue relying on natural ordering also does not permit
035         * insertion of non-comparable objects (doing so may result in
036         * {@code ClassCastException}).
037         *
038         * <p>The <em>head</em> of this queue is the <em>least</em> element
039         * with respect to the specified ordering.  If multiple elements are
040         * tied for least value, the head is one of those elements -- ties are
041         * broken arbitrarily.  The queue retrieval operations {@code poll},
042         * {@code remove}, {@code peek}, and {@code element} access the
043         * element at the head of the queue.
044         *
045         * <p>A priority queue is unbounded, but has an internal
046         * <i>capacity</i> governing the size of an array used to store the
047         * elements on the queue.  It is always at least as large as the queue
048         * size.  As elements are added to a priority queue, its capacity
049         * grows automatically.  The details of the growth policy are not
050         * specified.
051         *
052         * <p>This class and its iterator implement all of the
053         * <em>optional</em> methods of the {@link Collection} and {@link
054         * Iterator} interfaces.  The Iterator provided in method {@link
055         * #iterator()} is <em>not</em> guaranteed to traverse the elements of
056         * the priority queue in any particular order. If you need ordered
057         * traversal, consider using {@code Arrays.sort(pq.toArray())}.
058         *
059         * <p> <strong>Note that this implementation is not synchronized.</strong>
060         * Multiple threads should not access a {@code PriorityQueue}
061         * instance concurrently if any of the threads modifies the queue.
062         * Instead, use the thread-safe {@link
063         * java.util.concurrent.PriorityBlockingQueue} class.
064         *
065         * <p>Implementation note: this implementation provides
066         * O(log(n)) time for the enqueing and dequeing methods
067         * ({@code offer}, {@code poll}, {@code remove()} and {@code add});
068         * linear time for the {@code remove(Object)} and {@code contains(Object)}
069         * methods; and constant time for the retrieval methods
070         * ({@code peek}, {@code element}, and {@code size}).
071         *
072         * <p>This class is a member of the
073         * <a href="{@docRoot}/../technotes/guides/collections/index.html">
074         * Java Collections Framework</a>.
075         *
076         * @since 1.5
077         * @version 1.22, 05/05/07
078         * @author Josh Bloch, Doug Lea
079         * @param <E> the type of elements held in this collection
080         */
081        public class PriorityQueue<E> extends AbstractQueue<E> implements 
082                java.io.Serializable {
083
084            private static final long serialVersionUID = -7720805057305804111L;
085
086            private static final int DEFAULT_INITIAL_CAPACITY = 11;
087
088            /**
089             * Priority queue represented as a balanced binary heap: the two
090             * children of queue[n] are queue[2*n+1] and queue[2*(n+1)].  The
091             * priority queue is ordered by comparator, or by the elements'
092             * natural ordering, if comparator is null: For each node n in the
093             * heap and each descendant d of n, n <= d.  The element with the
094             * lowest value is in queue[0], assuming the queue is nonempty.
095             */
096            private transient Object[] queue;
097
098            /**
099             * The number of elements in the priority queue.
100             */
101            private int size = 0;
102
103            /**
104             * The comparator, or null if priority queue uses elements'
105             * natural ordering.
106             */
107            private final Comparator<? super  E> comparator;
108
109            /**
110             * The number of times this priority queue has been
111             * <i>structurally modified</i>.  See AbstractList for gory details.
112             */
113            private transient int modCount = 0;
114
115            /**
116             * Creates a {@code PriorityQueue} with the default initial
117             * capacity (11) that orders its elements according to their
118             * {@linkplain Comparable natural ordering}.
119             */
120            public PriorityQueue() {
121                this (DEFAULT_INITIAL_CAPACITY, null);
122            }
123
124            /**
125             * Creates a {@code PriorityQueue} with the specified initial
126             * capacity that orders its elements according to their
127             * {@linkplain Comparable natural ordering}.
128             *
129             * @param initialCapacity the initial capacity for this priority queue
130             * @throws IllegalArgumentException if {@code initialCapacity} is less
131             *         than 1
132             */
133            public PriorityQueue(int initialCapacity) {
134                this (initialCapacity, null);
135            }
136
137            /**
138             * Creates a {@code PriorityQueue} with the specified initial capacity
139             * that orders its elements according to the specified comparator.
140             *
141             * @param  initialCapacity the initial capacity for this priority queue
142             * @param  comparator the comparator that will be used to order this
143             *         priority queue.  If {@code null}, the {@linkplain Comparable
144             *         natural ordering} of the elements will be used.
145             * @throws IllegalArgumentException if {@code initialCapacity} is
146             *         less than 1
147             */
148            public PriorityQueue(int initialCapacity,
149                    Comparator<? super  E> comparator) {
150                // Note: This restriction of at least one is not actually needed,
151                // but continues for 1.5 compatibility
152                if (initialCapacity < 1)
153                    throw new IllegalArgumentException();
154                this .queue = new Object[initialCapacity];
155                this .comparator = comparator;
156            }
157
158            /**
159             * Creates a {@code PriorityQueue} containing the elements in the
160             * specified collection.  If the specified collection is an instance of
161             * a {@link SortedSet} or is another {@code PriorityQueue}, this
162             * priority queue will be ordered according to the same ordering.
163             * Otherwise, this priority queue will be ordered according to the
164             * {@linkplain Comparable natural ordering} of its elements.
165             *
166             * @param  c the collection whose elements are to be placed
167             *         into this priority queue
168             * @throws ClassCastException if elements of the specified collection
169             *         cannot be compared to one another according to the priority
170             *         queue's ordering
171             * @throws NullPointerException if the specified collection or any
172             *         of its elements are null
173             */
174            public PriorityQueue(Collection<? extends E> c) {
175                initFromCollection(c);
176                if (c instanceof  SortedSet)
177                    comparator = (Comparator<? super  E>) ((SortedSet<? extends E>) c)
178                            .comparator();
179                else if (c instanceof  PriorityQueue)
180                    comparator = (Comparator<? super  E>) ((PriorityQueue<? extends E>) c)
181                            .comparator();
182                else {
183                    comparator = null;
184                    heapify();
185                }
186            }
187
188            /**
189             * Creates a {@code PriorityQueue} containing the elements in the
190             * specified priority queue.  This priority queue will be
191             * ordered according to the same ordering as the given priority
192             * queue.
193             *
194             * @param  c the priority queue whose elements are to be placed
195             *         into this priority queue
196             * @throws ClassCastException if elements of {@code c} cannot be
197             *         compared to one another according to {@code c}'s
198             *         ordering
199             * @throws NullPointerException if the specified priority queue or any
200             *         of its elements are null
201             */
202            public PriorityQueue(PriorityQueue<? extends E> c) {
203                comparator = (Comparator<? super  E>) c.comparator();
204                initFromCollection(c);
205            }
206
207            /**
208             * Creates a {@code PriorityQueue} containing the elements in the
209             * specified sorted set.   This priority queue will be ordered
210             * according to the same ordering as the given sorted set.
211             *
212             * @param  c the sorted set whose elements are to be placed
213             *         into this priority queue
214             * @throws ClassCastException if elements of the specified sorted
215             *         set cannot be compared to one another according to the
216             *         sorted set's ordering
217             * @throws NullPointerException if the specified sorted set or any
218             *         of its elements are null
219             */
220            public PriorityQueue(SortedSet<? extends E> c) {
221                comparator = (Comparator<? super  E>) c.comparator();
222                initFromCollection(c);
223            }
224
225            /**
226             * Initializes queue array with elements from the given Collection.
227             *
228             * @param c the collection
229             */
230            private void initFromCollection(Collection<? extends E> c) {
231                Object[] a = c.toArray();
232                // If c.toArray incorrectly doesn't return Object[], copy it.
233                if (a.getClass() != Object[].class)
234                    a = Arrays.copyOf(a, a.length, Object[].class);
235                queue = a;
236                size = a.length;
237            }
238
239            /**
240             * Increases the capacity of the array.
241             *
242             * @param minCapacity the desired minimum capacity
243             */
244            private void grow(int minCapacity) {
245                if (minCapacity < 0) // overflow
246                    throw new OutOfMemoryError();
247                int oldCapacity = queue.length;
248                // Double size if small; else grow by 50%
249                int newCapacity = ((oldCapacity < 64) ? ((oldCapacity + 1) * 2)
250                        : ((oldCapacity / 2) * 3));
251                if (newCapacity < 0) // overflow
252                    newCapacity = Integer.MAX_VALUE;
253                if (newCapacity < minCapacity)
254                    newCapacity = minCapacity;
255                queue = Arrays.copyOf(queue, newCapacity);
256            }
257
258            /**
259             * Inserts the specified element into this priority queue.
260             *
261             * @return {@code true} (as specified by {@link Collection#add})
262             * @throws ClassCastException if the specified element cannot be
263             *         compared with elements currently in this priority queue
264             *         according to the priority queue's ordering
265             * @throws NullPointerException if the specified element is null
266             */
267            public boolean add(E e) {
268                return offer(e);
269            }
270
271            /**
272             * Inserts the specified element into this priority queue.
273             *
274             * @return {@code true} (as specified by {@link Queue#offer})
275             * @throws ClassCastException if the specified element cannot be
276             *         compared with elements currently in this priority queue
277             *         according to the priority queue's ordering
278             * @throws NullPointerException if the specified element is null
279             */
280            public boolean offer(E e) {
281                if (e == null)
282                    throw new NullPointerException();
283                modCount++;
284                int i = size;
285                if (i >= queue.length)
286                    grow(i + 1);
287                size = i + 1;
288                if (i == 0)
289                    queue[0] = e;
290                else
291                    siftUp(i, e);
292                return true;
293            }
294
295            public E peek() {
296                if (size == 0)
297                    return null;
298                return (E) queue[0];
299            }
300
301            private int indexOf(Object o) {
302                if (o != null) {
303                    for (int i = 0; i < size; i++)
304                        if (o.equals(queue[i]))
305                            return i;
306                }
307                return -1;
308            }
309
310            /**
311             * Removes a single instance of the specified element from this queue,
312             * if it is present.  More formally, removes an element {@code e} such
313             * that {@code o.equals(e)}, if this queue contains one or more such
314             * elements.  Returns {@code true} if and only if this queue contained
315             * the specified element (or equivalently, if this queue changed as a
316             * result of the call).
317             *
318             * @param o element to be removed from this queue, if present
319             * @return {@code true} if this queue changed as a result of the call
320             */
321            public boolean remove(Object o) {
322                int i = indexOf(o);
323                if (i == -1)
324                    return false;
325                else {
326                    removeAt(i);
327                    return true;
328                }
329            }
330
331            /**
332             * Version of remove using reference equality, not equals.
333             * Needed by iterator.remove.
334             *
335             * @param o element to be removed from this queue, if present
336             * @return {@code true} if removed
337             */
338            boolean removeEq(Object o) {
339                for (int i = 0; i < size; i++) {
340                    if (o == queue[i]) {
341                        removeAt(i);
342                        return true;
343                    }
344                }
345                return false;
346            }
347
348            /**
349             * Returns {@code true} if this queue contains the specified element.
350             * More formally, returns {@code true} if and only if this queue contains
351             * at least one element {@code e} such that {@code o.equals(e)}.
352             *
353             * @param o object to be checked for containment in this queue
354             * @return {@code true} if this queue contains the specified element
355             */
356            public boolean contains(Object o) {
357                return indexOf(o) != -1;
358            }
359
360            /**
361             * Returns an array containing all of the elements in this queue.
362             * The elements are in no particular order.
363             *
364             * <p>The returned array will be "safe" in that no references to it are
365             * maintained by this queue.  (In other words, this method must allocate
366             * a new array).  The caller is thus free to modify the returned array.
367             *
368             * <p>This method acts as bridge between array-based and collection-based
369             * APIs.
370             *
371             * @return an array containing all of the elements in this queue
372             */
373            public Object[] toArray() {
374                return Arrays.copyOf(queue, size);
375            }
376
377            /**
378             * Returns an array containing all of the elements in this queue; the
379             * runtime type of the returned array is that of the specified array.
380             * The returned array elements are in no particular order.
381             * If the queue fits in the specified array, it is returned therein.
382             * Otherwise, a new array is allocated with the runtime type of the
383             * specified array and the size of this queue.
384             *
385             * <p>If the queue fits in the specified array with room to spare
386             * (i.e., the array has more elements than the queue), the element in
387             * the array immediately following the end of the collection is set to
388             * {@code null}.
389             *
390             * <p>Like the {@link #toArray()} method, this method acts as bridge between
391             * array-based and collection-based APIs.  Further, this method allows
392             * precise control over the runtime type of the output array, and may,
393             * under certain circumstances, be used to save allocation costs.
394             *
395             * <p>Suppose <tt>x</tt> is a queue known to contain only strings.
396             * The following code can be used to dump the queue into a newly
397             * allocated array of <tt>String</tt>:
398             *
399             * <pre>
400             *     String[] y = x.toArray(new String[0]);</pre>
401             *
402             * Note that <tt>toArray(new Object[0])</tt> is identical in function to
403             * <tt>toArray()</tt>.
404             *
405             * @param a the array into which the elements of the queue are to
406             *          be stored, if it is big enough; otherwise, a new array of the
407             *          same runtime type is allocated for this purpose.
408             * @return an array containing all of the elements in this queue
409             * @throws ArrayStoreException if the runtime type of the specified array
410             *         is not a supertype of the runtime type of every element in
411             *         this queue
412             * @throws NullPointerException if the specified array is null
413             */
414            public <T> T[] toArray(T[] a) {
415                if (a.length < size)
416                    // Make a new array of a's runtime type, but my contents:
417                    return (T[]) Arrays.copyOf(queue, size, a.getClass());
418                System.arraycopy(queue, 0, a, 0, size);
419                if (a.length > size)
420                    a[size] = null;
421                return a;
422            }
423
424            /**
425             * Returns an iterator over the elements in this queue. The iterator
426             * does not return the elements in any particular order.
427             *
428             * @return an iterator over the elements in this queue
429             */
430            public Iterator<E> iterator() {
431                return new Itr();
432            }
433
434            private final class Itr implements  Iterator<E> {
435                /**
436                 * Index (into queue array) of element to be returned by
437                 * subsequent call to next.
438                 */
439                private int cursor = 0;
440
441                /**
442                 * Index of element returned by most recent call to next,
443                 * unless that element came from the forgetMeNot list.
444                 * Set to -1 if element is deleted by a call to remove.
445                 */
446                private int lastRet = -1;
447
448                /**
449                 * A queue of elements that were moved from the unvisited portion of
450                 * the heap into the visited portion as a result of "unlucky" element
451                 * removals during the iteration.  (Unlucky element removals are those
452                 * that require a siftup instead of a siftdown.)  We must visit all of
453                 * the elements in this list to complete the iteration.  We do this
454                 * after we've completed the "normal" iteration.
455                 *
456                 * We expect that most iterations, even those involving removals,
457                 * will not need to store elements in this field.
458                 */
459                private ArrayDeque<E> forgetMeNot = null;
460
461                /**
462                 * Element returned by the most recent call to next iff that
463                 * element was drawn from the forgetMeNot list.
464                 */
465                private E lastRetElt = null;
466
467                /**
468                 * The modCount value that the iterator believes that the backing
469                 * Queue should have.  If this expectation is violated, the iterator
470                 * has detected concurrent modification.
471                 */
472                private int expectedModCount = modCount;
473
474                public boolean hasNext() {
475                    return cursor < size
476                            || (forgetMeNot != null && !forgetMeNot.isEmpty());
477                }
478
479                public E next() {
480                    if (expectedModCount != modCount)
481                        throw new ConcurrentModificationException();
482                    if (cursor < size)
483                        return (E) queue[lastRet = cursor++];
484                    if (forgetMeNot != null) {
485                        lastRet = -1;
486                        lastRetElt = forgetMeNot.poll();
487                        if (lastRetElt != null)
488                            return lastRetElt;
489                    }
490                    throw new NoSuchElementException();
491                }
492
493                public void remove() {
494                    if (expectedModCount != modCount)
495                        throw new ConcurrentModificationException();
496                    if (lastRet != -1) {
497                        E moved = PriorityQueue.this .removeAt(lastRet);
498                        lastRet = -1;
499                        if (moved == null)
500                            cursor--;
501                        else {
502                            if (forgetMeNot == null)
503                                forgetMeNot = new ArrayDeque<E>();
504                            forgetMeNot.add(moved);
505                        }
506                    } else if (lastRetElt != null) {
507                        PriorityQueue.this .removeEq(lastRetElt);
508                        lastRetElt = null;
509                    } else {
510                        throw new IllegalStateException();
511                    }
512                    expectedModCount = modCount;
513                }
514            }
515
516            public int size() {
517                return size;
518            }
519
520            /**
521             * Removes all of the elements from this priority queue.
522             * The queue will be empty after this call returns.
523             */
524            public void clear() {
525                modCount++;
526                for (int i = 0; i < size; i++)
527                    queue[i] = null;
528                size = 0;
529            }
530
531            public E poll() {
532                if (size == 0)
533                    return null;
534                int s = --size;
535                modCount++;
536                E result = (E) queue[0];
537                E x = (E) queue[s];
538                queue[s] = null;
539                if (s != 0)
540                    siftDown(0, x);
541                return result;
542            }
543
544            /**
545             * Removes the ith element from queue.
546             *
547             * Normally this method leaves the elements at up to i-1,
548             * inclusive, untouched.  Under these circumstances, it returns
549             * null.  Occasionally, in order to maintain the heap invariant,
550             * it must swap a later element of the list with one earlier than
551             * i.  Under these circumstances, this method returns the element
552             * that was previously at the end of the list and is now at some
553             * position before i. This fact is used by iterator.remove so as to
554             * avoid missing traversing elements.
555             */
556            private E removeAt(int i) {
557                assert i >= 0 && i < size;
558                modCount++;
559                int s = --size;
560                if (s == i) // removed last element
561                    queue[i] = null;
562                else {
563                    E moved = (E) queue[s];
564                    queue[s] = null;
565                    siftDown(i, moved);
566                    if (queue[i] == moved) {
567                        siftUp(i, moved);
568                        if (queue[i] != moved)
569                            return moved;
570                    }
571                }
572                return null;
573            }
574
575            /**
576             * Inserts item x at position k, maintaining heap invariant by
577             * promoting x up the tree until it is greater than or equal to
578             * its parent, or is the root.
579             *
580             * To simplify and speed up coercions and comparisons. the
581             * Comparable and Comparator versions are separated into different
582             * methods that are otherwise identical. (Similarly for siftDown.)
583             *
584             * @param k the position to fill
585             * @param x the item to insert
586             */
587            private void siftUp(int k, E x) {
588                if (comparator != null)
589                    siftUpUsingComparator(k, x);
590                else
591                    siftUpComparable(k, x);
592            }
593
594            private void siftUpComparable(int k, E x) {
595                Comparable<? super  E> key = (Comparable<? super  E>) x;
596                while (k > 0) {
597                    int parent = (k - 1) >>> 1;
598                    Object e = queue[parent];
599                    if (key.compareTo((E) e) >= 0)
600                        break;
601                    queue[k] = e;
602                    k = parent;
603                }
604                queue[k] = key;
605            }
606
607            private void siftUpUsingComparator(int k, E x) {
608                while (k > 0) {
609                    int parent = (k - 1) >>> 1;
610                    Object e = queue[parent];
611                    if (comparator.compare(x, (E) e) >= 0)
612                        break;
613                    queue[k] = e;
614                    k = parent;
615                }
616                queue[k] = x;
617            }
618
619            /**
620             * Inserts item x at position k, maintaining heap invariant by
621             * demoting x down the tree repeatedly until it is less than or
622             * equal to its children or is a leaf.
623             *
624             * @param k the position to fill
625             * @param x the item to insert
626             */
627            private void siftDown(int k, E x) {
628                if (comparator != null)
629                    siftDownUsingComparator(k, x);
630                else
631                    siftDownComparable(k, x);
632            }
633
634            private void siftDownComparable(int k, E x) {
635                Comparable<? super  E> key = (Comparable<? super  E>) x;
636                int half = size >>> 1; // loop while a non-leaf
637                while (k < half) {
638                    int child = (k << 1) + 1; // assume left child is least
639                    Object c = queue[child];
640                    int right = child + 1;
641                    if (right < size
642                            && ((Comparable<? super  E>) c)
643                                    .compareTo((E) queue[right]) > 0)
644                        c = queue[child = right];
645                    if (key.compareTo((E) c) <= 0)
646                        break;
647                    queue[k] = c;
648                    k = child;
649                }
650                queue[k] = key;
651            }
652
653            private void siftDownUsingComparator(int k, E x) {
654                int half = size >>> 1;
655                while (k < half) {
656                    int child = (k << 1) + 1;
657                    Object c = queue[child];
658                    int right = child + 1;
659                    if (right < size
660                            && comparator.compare((E) c, (E) queue[right]) > 0)
661                        c = queue[child = right];
662                    if (comparator.compare(x, (E) c) <= 0)
663                        break;
664                    queue[k] = c;
665                    k = child;
666                }
667                queue[k] = x;
668            }
669
670            /**
671             * Establishes the heap invariant (described above) in the entire tree,
672             * assuming nothing about the order of the elements prior to the call.
673             */
674            private void heapify() {
675                for (int i = (size >>> 1) - 1; i >= 0; i--)
676                    siftDown(i, (E) queue[i]);
677            }
678
679            /**
680             * Returns the comparator used to order the elements in this
681             * queue, or {@code null} if this queue is sorted according to
682             * the {@linkplain Comparable natural ordering} of its elements.
683             *
684             * @return the comparator used to order this queue, or
685             *         {@code null} if this queue is sorted according to the
686             *         natural ordering of its elements
687             */
688            public Comparator<? super  E> comparator() {
689                return comparator;
690            }
691
692            /**
693             * Saves the state of the instance to a stream (that
694             * is, serializes it).
695             *
696             * @serialData The length of the array backing the instance is
697             *             emitted (int), followed by all of its elements
698             *             (each an {@code Object}) in the proper order.
699             * @param s the stream
700             */
701            private void writeObject(java.io.ObjectOutputStream s)
702                    throws java.io.IOException {
703                // Write out element count, and any hidden stuff
704                s.defaultWriteObject();
705
706                // Write out array length, for compatibility with 1.5 version
707                s.writeInt(Math.max(2, size + 1));
708
709                // Write out all elements in the "proper order".
710                for (int i = 0; i < size; i++)
711                    s.writeObject(queue[i]);
712            }
713
714            /**
715             * Reconstitutes the {@code PriorityQueue} instance from a stream
716             * (that is, deserializes it).
717             *
718             * @param s the stream
719             */
720            private void readObject(java.io.ObjectInputStream s)
721                    throws java.io.IOException, ClassNotFoundException {
722                // Read in size, and any hidden stuff
723                s.defaultReadObject();
724
725                // Read in (and discard) array length
726                s.readInt();
727
728                queue = new Object[size];
729
730                // Read in all elements.
731                for (int i = 0; i < size; i++)
732                    queue[i] = s.readObject();
733
734                // Elements are guaranteed to be in "proper order", but the
735                // spec has never explained what that might be.
736                heapify();
737            }
738        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.