Source Code Cross Referenced for Collections.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) 


0001        /*
0002         * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
0003         * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0004         *
0005         * This code is free software; you can redistribute it and/or modify it
0006         * under the terms of the GNU General Public License version 2 only, as
0007         * published by the Free Software Foundation.  Sun designates this
0008         * particular file as subject to the "Classpath" exception as provided
0009         * by Sun in the LICENSE file that accompanied this code.
0010         *
0011         * This code is distributed in the hope that it will be useful, but WITHOUT
0012         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0013         * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0014         * version 2 for more details (a copy is included in the LICENSE file that
0015         * accompanied this code).
0016         *
0017         * You should have received a copy of the GNU General Public License version
0018         * 2 along with this work; if not, write to the Free Software Foundation,
0019         * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0020         *
0021         * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
0022         * CA 95054 USA or visit www.sun.com if you need additional information or
0023         * have any questions.
0024         */
0025
0026        package java.util;
0027
0028        import java.io.Serializable;
0029        import java.io.ObjectOutputStream;
0030        import java.io.IOException;
0031        import java.lang.reflect.Array;
0032
0033        /**
0034         * This class consists exclusively of static methods that operate on or return
0035         * collections.  It contains polymorphic algorithms that operate on
0036         * collections, "wrappers", which return a new collection backed by a
0037         * specified collection, and a few other odds and ends.
0038         *
0039         * <p>The methods of this class all throw a <tt>NullPointerException</tt>
0040         * if the collections or class objects provided to them are null.
0041         *
0042         * <p>The documentation for the polymorphic algorithms contained in this class
0043         * generally includes a brief description of the <i>implementation</i>.  Such
0044         * descriptions should be regarded as <i>implementation notes</i>, rather than
0045         * parts of the <i>specification</i>.  Implementors should feel free to
0046         * substitute other algorithms, so long as the specification itself is adhered
0047         * to.  (For example, the algorithm used by <tt>sort</tt> does not have to be
0048         * a mergesort, but it does have to be <i>stable</i>.)
0049         *
0050         * <p>The "destructive" algorithms contained in this class, that is, the
0051         * algorithms that modify the collection on which they operate, are specified
0052         * to throw <tt>UnsupportedOperationException</tt> if the collection does not
0053         * support the appropriate mutation primitive(s), such as the <tt>set</tt>
0054         * method.  These algorithms may, but are not required to, throw this
0055         * exception if an invocation would have no effect on the collection.  For
0056         * example, invoking the <tt>sort</tt> method on an unmodifiable list that is
0057         * already sorted may or may not throw <tt>UnsupportedOperationException</tt>.
0058         *
0059         * <p>This class is a member of the
0060         * <a href="{@docRoot}/../technotes/guides/collections/index.html">
0061         * Java Collections Framework</a>.
0062         *
0063         * @author  Josh Bloch
0064         * @author  Neal Gafter
0065         * @version 1.116, 07/23/07
0066         * @see	    Collection
0067         * @see	    Set
0068         * @see	    List
0069         * @see	    Map
0070         * @since   1.2
0071         */
0072
0073        public class Collections {
0074            // Suppresses default constructor, ensuring non-instantiability.
0075            private Collections() {
0076            }
0077
0078            // Algorithms
0079
0080            /*
0081             * Tuning parameters for algorithms - Many of the List algorithms have
0082             * two implementations, one of which is appropriate for RandomAccess
0083             * lists, the other for "sequential."  Often, the random access variant
0084             * yields better performance on small sequential access lists.  The
0085             * tuning parameters below determine the cutoff point for what constitutes
0086             * a "small" sequential access list for each algorithm.  The values below
0087             * were empirically determined to work well for LinkedList. Hopefully
0088             * they should be reasonable for other sequential access List
0089             * implementations.  Those doing performance work on this code would
0090             * do well to validate the values of these parameters from time to time.
0091             * (The first word of each tuning parameter name is the algorithm to which
0092             * it applies.)
0093             */
0094            private static final int BINARYSEARCH_THRESHOLD = 5000;
0095            private static final int REVERSE_THRESHOLD = 18;
0096            private static final int SHUFFLE_THRESHOLD = 5;
0097            private static final int FILL_THRESHOLD = 25;
0098            private static final int ROTATE_THRESHOLD = 100;
0099            private static final int COPY_THRESHOLD = 10;
0100            private static final int REPLACEALL_THRESHOLD = 11;
0101            private static final int INDEXOFSUBLIST_THRESHOLD = 35;
0102
0103            /**
0104             * Sorts the specified list into ascending order, according to the
0105             * <i>natural ordering</i> of its elements.  All elements in the list must
0106             * implement the <tt>Comparable</tt> interface.  Furthermore, all elements
0107             * in the list must be <i>mutually comparable</i> (that is,
0108             * <tt>e1.compareTo(e2)</tt> must not throw a <tt>ClassCastException</tt>
0109             * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p>
0110             *
0111             * This sort is guaranteed to be <i>stable</i>:  equal elements will
0112             * not be reordered as a result of the sort.<p>
0113             *
0114             * The specified list must be modifiable, but need not be resizable.<p>
0115             *
0116             * The sorting algorithm is a modified mergesort (in which the merge is
0117             * omitted if the highest element in the low sublist is less than the
0118             * lowest element in the high sublist).  This algorithm offers guaranteed
0119             * n log(n) performance.
0120             *
0121             * This implementation dumps the specified list into an array, sorts
0122             * the array, and iterates over the list resetting each element
0123             * from the corresponding position in the array.  This avoids the
0124             * n<sup>2</sup> log(n) performance that would result from attempting
0125             * to sort a linked list in place.
0126             *
0127             * @param  list the list to be sorted.
0128             * @throws ClassCastException if the list contains elements that are not
0129             *	       <i>mutually comparable</i> (for example, strings and integers).
0130             * @throws UnsupportedOperationException if the specified list's
0131             *	       list-iterator does not support the <tt>set</tt> operation.
0132             * @see Comparable
0133             */
0134            public static <T extends Comparable<? super  T>> void sort(
0135                    List<T> list) {
0136                Object[] a = list.toArray();
0137                Arrays.sort(a);
0138                ListIterator<T> i = list.listIterator();
0139                for (int j = 0; j < a.length; j++) {
0140                    i.next();
0141                    i.set((T) a[j]);
0142                }
0143            }
0144
0145            /**
0146             * Sorts the specified list according to the order induced by the
0147             * specified comparator.  All elements in the list must be <i>mutually
0148             * comparable</i> using the specified comparator (that is,
0149             * <tt>c.compare(e1, e2)</tt> must not throw a <tt>ClassCastException</tt>
0150             * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p>
0151             *
0152             * This sort is guaranteed to be <i>stable</i>:  equal elements will
0153             * not be reordered as a result of the sort.<p>
0154             *
0155             * The sorting algorithm is a modified mergesort (in which the merge is
0156             * omitted if the highest element in the low sublist is less than the
0157             * lowest element in the high sublist).  This algorithm offers guaranteed
0158             * n log(n) performance.
0159             *
0160             * The specified list must be modifiable, but need not be resizable.
0161             * This implementation dumps the specified list into an array, sorts
0162             * the array, and iterates over the list resetting each element
0163             * from the corresponding position in the array.  This avoids the
0164             * n<sup>2</sup> log(n) performance that would result from attempting
0165             * to sort a linked list in place.
0166             *
0167             * @param  list the list to be sorted.
0168             * @param  c the comparator to determine the order of the list.  A
0169             *        <tt>null</tt> value indicates that the elements' <i>natural
0170             *        ordering</i> should be used.
0171             * @throws ClassCastException if the list contains elements that are not
0172             *	       <i>mutually comparable</i> using the specified comparator.
0173             * @throws UnsupportedOperationException if the specified list's
0174             *	       list-iterator does not support the <tt>set</tt> operation.
0175             * @see Comparator
0176             */
0177            public static <T> void sort(List<T> list, Comparator<? super  T> c) {
0178                Object[] a = list.toArray();
0179                Arrays.sort(a, (Comparator) c);
0180                ListIterator i = list.listIterator();
0181                for (int j = 0; j < a.length; j++) {
0182                    i.next();
0183                    i.set(a[j]);
0184                }
0185            }
0186
0187            /**
0188             * Searches the specified list for the specified object using the binary
0189             * search algorithm.  The list must be sorted into ascending order
0190             * according to the {@linkplain Comparable natural ordering} of its
0191             * elements (as by the {@link #sort(List)} method) prior to making this
0192             * call.  If it is not sorted, the results are undefined.  If the list
0193             * contains multiple elements equal to the specified object, there is no
0194             * guarantee which one will be found.
0195             *
0196             * <p>This method runs in log(n) time for a "random access" list (which
0197             * provides near-constant-time positional access).  If the specified list
0198             * does not implement the {@link RandomAccess} interface and is large,
0199             * this method will do an iterator-based binary search that performs
0200             * O(n) link traversals and O(log n) element comparisons.
0201             *
0202             * @param  list the list to be searched.
0203             * @param  key the key to be searched for.
0204             * @return the index of the search key, if it is contained in the list;
0205             *	       otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
0206             *	       <i>insertion point</i> is defined as the point at which the
0207             *	       key would be inserted into the list: the index of the first
0208             *	       element greater than the key, or <tt>list.size()</tt> if all
0209             *	       elements in the list are less than the specified key.  Note
0210             *	       that this guarantees that the return value will be &gt;= 0 if
0211             *	       and only if the key is found.
0212             * @throws ClassCastException if the list contains elements that are not
0213             *	       <i>mutually comparable</i> (for example, strings and
0214             *	       integers), or the search key is not mutually comparable
0215             *	       with the elements of the list.
0216             */
0217            public static <T> int binarySearch(
0218                    List<? extends Comparable<? super  T>> list, T key) {
0219                if (list instanceof  RandomAccess
0220                        || list.size() < BINARYSEARCH_THRESHOLD)
0221                    return Collections.indexedBinarySearch(list, key);
0222                else
0223                    return Collections.iteratorBinarySearch(list, key);
0224            }
0225
0226            private static <T> int indexedBinarySearch(
0227                    List<? extends Comparable<? super  T>> list, T key) {
0228                int low = 0;
0229                int high = list.size() - 1;
0230
0231                while (low <= high) {
0232                    int mid = (low + high) >>> 1;
0233                    Comparable<? super  T> midVal = list.get(mid);
0234                    int cmp = midVal.compareTo(key);
0235
0236                    if (cmp < 0)
0237                        low = mid + 1;
0238                    else if (cmp > 0)
0239                        high = mid - 1;
0240                    else
0241                        return mid; // key found
0242                }
0243                return -(low + 1); // key not found
0244            }
0245
0246            private static <T> int iteratorBinarySearch(
0247                    List<? extends Comparable<? super  T>> list, T key) {
0248                int low = 0;
0249                int high = list.size() - 1;
0250                ListIterator<? extends Comparable<? super  T>> i = list
0251                        .listIterator();
0252
0253                while (low <= high) {
0254                    int mid = (low + high) >>> 1;
0255                    Comparable<? super  T> midVal = get(i, mid);
0256                    int cmp = midVal.compareTo(key);
0257
0258                    if (cmp < 0)
0259                        low = mid + 1;
0260                    else if (cmp > 0)
0261                        high = mid - 1;
0262                    else
0263                        return mid; // key found
0264                }
0265                return -(low + 1); // key not found
0266            }
0267
0268            /**
0269             * Gets the ith element from the given list by repositioning the specified
0270             * list listIterator.
0271             */
0272            private static <T> T get(ListIterator<? extends T> i, int index) {
0273                T obj = null;
0274                int pos = i.nextIndex();
0275                if (pos <= index) {
0276                    do {
0277                        obj = i.next();
0278                    } while (pos++ < index);
0279                } else {
0280                    do {
0281                        obj = i.previous();
0282                    } while (--pos > index);
0283                }
0284                return obj;
0285            }
0286
0287            /**
0288             * Searches the specified list for the specified object using the binary
0289             * search algorithm.  The list must be sorted into ascending order
0290             * according to the specified comparator (as by the
0291             * {@link #sort(List, Comparator) sort(List, Comparator)}
0292             * method), prior to making this call.  If it is
0293             * not sorted, the results are undefined.  If the list contains multiple
0294             * elements equal to the specified object, there is no guarantee which one
0295             * will be found.
0296             *
0297             * <p>This method runs in log(n) time for a "random access" list (which
0298             * provides near-constant-time positional access).  If the specified list
0299             * does not implement the {@link RandomAccess} interface and is large,
0300             * this method will do an iterator-based binary search that performs
0301             * O(n) link traversals and O(log n) element comparisons.
0302             *
0303             * @param  list the list to be searched.
0304             * @param  key the key to be searched for.
0305             * @param  c the comparator by which the list is ordered.
0306             *         A <tt>null</tt> value indicates that the elements'
0307             *	       {@linkplain Comparable natural ordering} should be used.
0308             * @return the index of the search key, if it is contained in the list;
0309             *	       otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
0310             *	       <i>insertion point</i> is defined as the point at which the
0311             *	       key would be inserted into the list: the index of the first
0312             *	       element greater than the key, or <tt>list.size()</tt> if all
0313             *	       elements in the list are less than the specified key.  Note
0314             *	       that this guarantees that the return value will be &gt;= 0 if
0315             *	       and only if the key is found.
0316             * @throws ClassCastException if the list contains elements that are not
0317             *	       <i>mutually comparable</i> using the specified comparator,
0318             *	       or the search key is not mutually comparable with the
0319             *	       elements of the list using this comparator.
0320             */
0321            public static <T> int binarySearch(List<? extends T> list, T key,
0322                    Comparator<? super  T> c) {
0323                if (c == null)
0324                    return binarySearch((List) list, key);
0325
0326                if (list instanceof  RandomAccess
0327                        || list.size() < BINARYSEARCH_THRESHOLD)
0328                    return Collections.indexedBinarySearch(list, key, c);
0329                else
0330                    return Collections.iteratorBinarySearch(list, key, c);
0331            }
0332
0333            private static <T> int indexedBinarySearch(List<? extends T> l,
0334                    T key, Comparator<? super  T> c) {
0335                int low = 0;
0336                int high = l.size() - 1;
0337
0338                while (low <= high) {
0339                    int mid = (low + high) >>> 1;
0340                    T midVal = l.get(mid);
0341                    int cmp = c.compare(midVal, key);
0342
0343                    if (cmp < 0)
0344                        low = mid + 1;
0345                    else if (cmp > 0)
0346                        high = mid - 1;
0347                    else
0348                        return mid; // key found
0349                }
0350                return -(low + 1); // key not found
0351            }
0352
0353            private static <T> int iteratorBinarySearch(List<? extends T> l,
0354                    T key, Comparator<? super  T> c) {
0355                int low = 0;
0356                int high = l.size() - 1;
0357                ListIterator<? extends T> i = l.listIterator();
0358
0359                while (low <= high) {
0360                    int mid = (low + high) >>> 1;
0361                    T midVal = get(i, mid);
0362                    int cmp = c.compare(midVal, key);
0363
0364                    if (cmp < 0)
0365                        low = mid + 1;
0366                    else if (cmp > 0)
0367                        high = mid - 1;
0368                    else
0369                        return mid; // key found
0370                }
0371                return -(low + 1); // key not found
0372            }
0373
0374            private interface SelfComparable extends Comparable<SelfComparable> {
0375            }
0376
0377            /**
0378             * Reverses the order of the elements in the specified list.<p>
0379             *
0380             * This method runs in linear time.
0381             *
0382             * @param  list the list whose elements are to be reversed.
0383             * @throws UnsupportedOperationException if the specified list or
0384             *         its list-iterator does not support the <tt>set</tt> operation.
0385             */
0386            public static void reverse(List<?> list) {
0387                int size = list.size();
0388                if (size < REVERSE_THRESHOLD || list instanceof  RandomAccess) {
0389                    for (int i = 0, mid = size >> 1, j = size - 1; i < mid; i++, j--)
0390                        swap(list, i, j);
0391                } else {
0392                    ListIterator fwd = list.listIterator();
0393                    ListIterator rev = list.listIterator(size);
0394                    for (int i = 0, mid = list.size() >> 1; i < mid; i++) {
0395                        Object tmp = fwd.next();
0396                        fwd.set(rev.previous());
0397                        rev.set(tmp);
0398                    }
0399                }
0400            }
0401
0402            /**
0403             * Randomly permutes the specified list using a default source of
0404             * randomness.  All permutations occur with approximately equal
0405             * likelihood.<p>
0406             *
0407             * The hedge "approximately" is used in the foregoing description because
0408             * default source of randomness is only approximately an unbiased source
0409             * of independently chosen bits. If it were a perfect source of randomly
0410             * chosen bits, then the algorithm would choose permutations with perfect
0411             * uniformity.<p>
0412             *
0413             * This implementation traverses the list backwards, from the last element
0414             * up to the second, repeatedly swapping a randomly selected element into
0415             * the "current position".  Elements are randomly selected from the
0416             * portion of the list that runs from the first element to the current
0417             * position, inclusive.<p>
0418             *
0419             * This method runs in linear time.  If the specified list does not
0420             * implement the {@link RandomAccess} interface and is large, this
0421             * implementation dumps the specified list into an array before shuffling
0422             * it, and dumps the shuffled array back into the list.  This avoids the
0423             * quadratic behavior that would result from shuffling a "sequential
0424             * access" list in place.
0425             *
0426             * @param  list the list to be shuffled.
0427             * @throws UnsupportedOperationException if the specified list or
0428             *         its list-iterator does not support the <tt>set</tt> operation.
0429             */
0430            public static void shuffle(List<?> list) {
0431                if (r == null) {
0432                    r = new Random();
0433                }
0434                shuffle(list, r);
0435            }
0436
0437            private static Random r;
0438
0439            /**
0440             * Randomly permute the specified list using the specified source of
0441             * randomness.  All permutations occur with equal likelihood
0442             * assuming that the source of randomness is fair.<p>
0443             *
0444             * This implementation traverses the list backwards, from the last element
0445             * up to the second, repeatedly swapping a randomly selected element into
0446             * the "current position".  Elements are randomly selected from the
0447             * portion of the list that runs from the first element to the current
0448             * position, inclusive.<p>
0449             *
0450             * This method runs in linear time.  If the specified list does not
0451             * implement the {@link RandomAccess} interface and is large, this
0452             * implementation dumps the specified list into an array before shuffling
0453             * it, and dumps the shuffled array back into the list.  This avoids the
0454             * quadratic behavior that would result from shuffling a "sequential
0455             * access" list in place.
0456             *
0457             * @param  list the list to be shuffled.
0458             * @param  rnd the source of randomness to use to shuffle the list.
0459             * @throws UnsupportedOperationException if the specified list or its
0460             *         list-iterator does not support the <tt>set</tt> operation.
0461             */
0462            public static void shuffle(List<?> list, Random rnd) {
0463                int size = list.size();
0464                if (size < SHUFFLE_THRESHOLD || list instanceof  RandomAccess) {
0465                    for (int i = size; i > 1; i--)
0466                        swap(list, i - 1, rnd.nextInt(i));
0467                } else {
0468                    Object arr[] = list.toArray();
0469
0470                    // Shuffle array
0471                    for (int i = size; i > 1; i--)
0472                        swap(arr, i - 1, rnd.nextInt(i));
0473
0474                    // Dump array back into list
0475                    ListIterator it = list.listIterator();
0476                    for (int i = 0; i < arr.length; i++) {
0477                        it.next();
0478                        it.set(arr[i]);
0479                    }
0480                }
0481            }
0482
0483            /**
0484             * Swaps the elements at the specified positions in the specified list.
0485             * (If the specified positions are equal, invoking this method leaves
0486             * the list unchanged.)
0487             *
0488             * @param list The list in which to swap elements.
0489             * @param i the index of one element to be swapped.
0490             * @param j the index of the other element to be swapped.
0491             * @throws IndexOutOfBoundsException if either <tt>i</tt> or <tt>j</tt>
0492             *         is out of range (i &lt; 0 || i &gt;= list.size()
0493             *         || j &lt; 0 || j &gt;= list.size()).
0494             * @since 1.4
0495             */
0496            public static void swap(List<?> list, int i, int j) {
0497                final List l = list;
0498                l.set(i, l.set(j, l.get(i)));
0499            }
0500
0501            /**
0502             * Swaps the two specified elements in the specified array.
0503             */
0504            private static void swap(Object[] arr, int i, int j) {
0505                Object tmp = arr[i];
0506                arr[i] = arr[j];
0507                arr[j] = tmp;
0508            }
0509
0510            /**
0511             * Replaces all of the elements of the specified list with the specified
0512             * element. <p>
0513             *
0514             * This method runs in linear time.
0515             *
0516             * @param  list the list to be filled with the specified element.
0517             * @param  obj The element with which to fill the specified list.
0518             * @throws UnsupportedOperationException if the specified list or its
0519             *	       list-iterator does not support the <tt>set</tt> operation.
0520             */
0521            public static <T> void fill(List<? super  T> list, T obj) {
0522                int size = list.size();
0523
0524                if (size < FILL_THRESHOLD || list instanceof  RandomAccess) {
0525                    for (int i = 0; i < size; i++)
0526                        list.set(i, obj);
0527                } else {
0528                    ListIterator<? super  T> itr = list.listIterator();
0529                    for (int i = 0; i < size; i++) {
0530                        itr.next();
0531                        itr.set(obj);
0532                    }
0533                }
0534            }
0535
0536            /**
0537             * Copies all of the elements from one list into another.  After the
0538             * operation, the index of each copied element in the destination list
0539             * will be identical to its index in the source list.  The destination
0540             * list must be at least as long as the source list.  If it is longer, the
0541             * remaining elements in the destination list are unaffected. <p>
0542             *
0543             * This method runs in linear time.
0544             *
0545             * @param  dest The destination list.
0546             * @param  src The source list.
0547             * @throws IndexOutOfBoundsException if the destination list is too small
0548             *         to contain the entire source List.
0549             * @throws UnsupportedOperationException if the destination list's
0550             *         list-iterator does not support the <tt>set</tt> operation.
0551             */
0552            public static <T> void copy(List<? super  T> dest,
0553                    List<? extends T> src) {
0554                int srcSize = src.size();
0555                if (srcSize > dest.size())
0556                    throw new IndexOutOfBoundsException(
0557                            "Source does not fit in dest");
0558
0559                if (srcSize < COPY_THRESHOLD
0560                        || (src instanceof  RandomAccess && dest instanceof  RandomAccess)) {
0561                    for (int i = 0; i < srcSize; i++)
0562                        dest.set(i, src.get(i));
0563                } else {
0564                    ListIterator<? super  T> di = dest.listIterator();
0565                    ListIterator<? extends T> si = src.listIterator();
0566                    for (int i = 0; i < srcSize; i++) {
0567                        di.next();
0568                        di.set(si.next());
0569                    }
0570                }
0571            }
0572
0573            /**
0574             * Returns the minimum element of the given collection, according to the
0575             * <i>natural ordering</i> of its elements.  All elements in the
0576             * collection must implement the <tt>Comparable</tt> interface.
0577             * Furthermore, all elements in the collection must be <i>mutually
0578             * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
0579             * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
0580             * <tt>e2</tt> in the collection).<p>
0581             *
0582             * This method iterates over the entire collection, hence it requires
0583             * time proportional to the size of the collection.
0584             *
0585             * @param  coll the collection whose minimum element is to be determined.
0586             * @return the minimum element of the given collection, according
0587             *         to the <i>natural ordering</i> of its elements.
0588             * @throws ClassCastException if the collection contains elements that are
0589             *	       not <i>mutually comparable</i> (for example, strings and
0590             *	       integers).
0591             * @throws NoSuchElementException if the collection is empty.
0592             * @see Comparable
0593             */
0594            public static <T extends Object & Comparable<? super  T>> T min(
0595                    Collection<? extends T> coll) {
0596                Iterator<? extends T> i = coll.iterator();
0597                T candidate = i.next();
0598
0599                while (i.hasNext()) {
0600                    T next = i.next();
0601                    if (next.compareTo(candidate) < 0)
0602                        candidate = next;
0603                }
0604                return candidate;
0605            }
0606
0607            /**
0608             * Returns the minimum element of the given collection, according to the
0609             * order induced by the specified comparator.  All elements in the
0610             * collection must be <i>mutually comparable</i> by the specified
0611             * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
0612             * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
0613             * <tt>e2</tt> in the collection).<p>
0614             *
0615             * This method iterates over the entire collection, hence it requires
0616             * time proportional to the size of the collection.
0617             *
0618             * @param  coll the collection whose minimum element is to be determined.
0619             * @param  comp the comparator with which to determine the minimum element.
0620             *         A <tt>null</tt> value indicates that the elements' <i>natural
0621             *         ordering</i> should be used.
0622             * @return the minimum element of the given collection, according
0623             *         to the specified comparator.
0624             * @throws ClassCastException if the collection contains elements that are
0625             *	       not <i>mutually comparable</i> using the specified comparator.
0626             * @throws NoSuchElementException if the collection is empty.
0627             * @see Comparable
0628             */
0629            public static <T> T min(Collection<? extends T> coll,
0630                    Comparator<? super  T> comp) {
0631                if (comp == null)
0632                    return (T) min((Collection<SelfComparable>) (Collection) coll);
0633
0634                Iterator<? extends T> i = coll.iterator();
0635                T candidate = i.next();
0636
0637                while (i.hasNext()) {
0638                    T next = i.next();
0639                    if (comp.compare(next, candidate) < 0)
0640                        candidate = next;
0641                }
0642                return candidate;
0643            }
0644
0645            /**
0646             * Returns the maximum element of the given collection, according to the
0647             * <i>natural ordering</i> of its elements.  All elements in the
0648             * collection must implement the <tt>Comparable</tt> interface.
0649             * Furthermore, all elements in the collection must be <i>mutually
0650             * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
0651             * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
0652             * <tt>e2</tt> in the collection).<p>
0653             *
0654             * This method iterates over the entire collection, hence it requires
0655             * time proportional to the size of the collection.
0656             *
0657             * @param  coll the collection whose maximum element is to be determined.
0658             * @return the maximum element of the given collection, according
0659             *         to the <i>natural ordering</i> of its elements.
0660             * @throws ClassCastException if the collection contains elements that are
0661             *	       not <i>mutually comparable</i> (for example, strings and
0662             *         integers).
0663             * @throws NoSuchElementException if the collection is empty.
0664             * @see Comparable
0665             */
0666            public static <T extends Object & Comparable<? super  T>> T max(
0667                    Collection<? extends T> coll) {
0668                Iterator<? extends T> i = coll.iterator();
0669                T candidate = i.next();
0670
0671                while (i.hasNext()) {
0672                    T next = i.next();
0673                    if (next.compareTo(candidate) > 0)
0674                        candidate = next;
0675                }
0676                return candidate;
0677            }
0678
0679            /**
0680             * Returns the maximum element of the given collection, according to the
0681             * order induced by the specified comparator.  All elements in the
0682             * collection must be <i>mutually comparable</i> by the specified
0683             * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
0684             * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
0685             * <tt>e2</tt> in the collection).<p>
0686             *
0687             * This method iterates over the entire collection, hence it requires
0688             * time proportional to the size of the collection.
0689             *
0690             * @param  coll the collection whose maximum element is to be determined.
0691             * @param  comp the comparator with which to determine the maximum element.
0692             *         A <tt>null</tt> value indicates that the elements' <i>natural
0693             *        ordering</i> should be used.
0694             * @return the maximum element of the given collection, according
0695             *         to the specified comparator.
0696             * @throws ClassCastException if the collection contains elements that are
0697             *	       not <i>mutually comparable</i> using the specified comparator.
0698             * @throws NoSuchElementException if the collection is empty.
0699             * @see Comparable
0700             */
0701            public static <T> T max(Collection<? extends T> coll,
0702                    Comparator<? super  T> comp) {
0703                if (comp == null)
0704                    return (T) max((Collection<SelfComparable>) (Collection) coll);
0705
0706                Iterator<? extends T> i = coll.iterator();
0707                T candidate = i.next();
0708
0709                while (i.hasNext()) {
0710                    T next = i.next();
0711                    if (comp.compare(next, candidate) > 0)
0712                        candidate = next;
0713                }
0714                return candidate;
0715            }
0716
0717            /**
0718             * Rotates the elements in the specified list by the specified distance.
0719             * After calling this method, the element at index <tt>i</tt> will be
0720             * the element previously at index <tt>(i - distance)</tt> mod
0721             * <tt>list.size()</tt>, for all values of <tt>i</tt> between <tt>0</tt>
0722             * and <tt>list.size()-1</tt>, inclusive.  (This method has no effect on
0723             * the size of the list.)
0724             *
0725             * <p>For example, suppose <tt>list</tt> comprises<tt> [t, a, n, k, s]</tt>.
0726             * After invoking <tt>Collections.rotate(list, 1)</tt> (or
0727             * <tt>Collections.rotate(list, -4)</tt>), <tt>list</tt> will comprise
0728             * <tt>[s, t, a, n, k]</tt>.
0729             *
0730             * <p>Note that this method can usefully be applied to sublists to
0731             * move one or more elements within a list while preserving the
0732             * order of the remaining elements.  For example, the following idiom
0733             * moves the element at index <tt>j</tt> forward to position
0734             * <tt>k</tt> (which must be greater than or equal to <tt>j</tt>):
0735             * <pre>
0736             *     Collections.rotate(list.subList(j, k+1), -1);
0737             * </pre>
0738             * To make this concrete, suppose <tt>list</tt> comprises
0739             * <tt>[a, b, c, d, e]</tt>.  To move the element at index <tt>1</tt>
0740             * (<tt>b</tt>) forward two positions, perform the following invocation:
0741             * <pre>
0742             *     Collections.rotate(l.subList(1, 4), -1);
0743             * </pre>
0744             * The resulting list is <tt>[a, c, d, b, e]</tt>.
0745             *
0746             * <p>To move more than one element forward, increase the absolute value
0747             * of the rotation distance.  To move elements backward, use a positive
0748             * shift distance.
0749             *
0750             * <p>If the specified list is small or implements the {@link
0751             * RandomAccess} interface, this implementation exchanges the first
0752             * element into the location it should go, and then repeatedly exchanges
0753             * the displaced element into the location it should go until a displaced
0754             * element is swapped into the first element.  If necessary, the process
0755             * is repeated on the second and successive elements, until the rotation
0756             * is complete.  If the specified list is large and doesn't implement the
0757             * <tt>RandomAccess</tt> interface, this implementation breaks the
0758             * list into two sublist views around index <tt>-distance mod size</tt>.
0759             * Then the {@link #reverse(List)} method is invoked on each sublist view,
0760             * and finally it is invoked on the entire list.  For a more complete
0761             * description of both algorithms, see Section 2.3 of Jon Bentley's
0762             * <i>Programming Pearls</i> (Addison-Wesley, 1986).
0763             *
0764             * @param list the list to be rotated.
0765             * @param distance the distance to rotate the list.  There are no
0766             *        constraints on this value; it may be zero, negative, or
0767             *        greater than <tt>list.size()</tt>.
0768             * @throws UnsupportedOperationException if the specified list or
0769             *         its list-iterator does not support the <tt>set</tt> operation.
0770             * @since 1.4
0771             */
0772            public static void rotate(List<?> list, int distance) {
0773                if (list instanceof  RandomAccess
0774                        || list.size() < ROTATE_THRESHOLD)
0775                    rotate1(list, distance);
0776                else
0777                    rotate2(list, distance);
0778            }
0779
0780            private static <T> void rotate1(List<T> list, int distance) {
0781                int size = list.size();
0782                if (size == 0)
0783                    return;
0784                distance = distance % size;
0785                if (distance < 0)
0786                    distance += size;
0787                if (distance == 0)
0788                    return;
0789
0790                for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
0791                    T displaced = list.get(cycleStart);
0792                    int i = cycleStart;
0793                    do {
0794                        i += distance;
0795                        if (i >= size)
0796                            i -= size;
0797                        displaced = list.set(i, displaced);
0798                        nMoved++;
0799                    } while (i != cycleStart);
0800                }
0801            }
0802
0803            private static void rotate2(List<?> list, int distance) {
0804                int size = list.size();
0805                if (size == 0)
0806                    return;
0807                int mid = -distance % size;
0808                if (mid < 0)
0809                    mid += size;
0810                if (mid == 0)
0811                    return;
0812
0813                reverse(list.subList(0, mid));
0814                reverse(list.subList(mid, size));
0815                reverse(list);
0816            }
0817
0818            /**
0819             * Replaces all occurrences of one specified value in a list with another.
0820             * More formally, replaces with <tt>newVal</tt> each element <tt>e</tt>
0821             * in <tt>list</tt> such that
0822             * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
0823             * (This method has no effect on the size of the list.)
0824             *
0825             * @param list the list in which replacement is to occur.
0826             * @param oldVal the old value to be replaced.
0827             * @param newVal the new value with which <tt>oldVal</tt> is to be
0828             *        replaced.
0829             * @return <tt>true</tt> if <tt>list</tt> contained one or more elements
0830             *         <tt>e</tt> such that
0831             *         <tt>(oldVal==null ?  e==null : oldVal.equals(e))</tt>.
0832             * @throws UnsupportedOperationException if the specified list or
0833             *         its list-iterator does not support the <tt>set</tt> operation.
0834             * @since  1.4
0835             */
0836            public static <T> boolean replaceAll(List<T> list, T oldVal,
0837                    T newVal) {
0838                boolean result = false;
0839                int size = list.size();
0840                if (size < REPLACEALL_THRESHOLD || list instanceof  RandomAccess) {
0841                    if (oldVal == null) {
0842                        for (int i = 0; i < size; i++) {
0843                            if (list.get(i) == null) {
0844                                list.set(i, newVal);
0845                                result = true;
0846                            }
0847                        }
0848                    } else {
0849                        for (int i = 0; i < size; i++) {
0850                            if (oldVal.equals(list.get(i))) {
0851                                list.set(i, newVal);
0852                                result = true;
0853                            }
0854                        }
0855                    }
0856                } else {
0857                    ListIterator<T> itr = list.listIterator();
0858                    if (oldVal == null) {
0859                        for (int i = 0; i < size; i++) {
0860                            if (itr.next() == null) {
0861                                itr.set(newVal);
0862                                result = true;
0863                            }
0864                        }
0865                    } else {
0866                        for (int i = 0; i < size; i++) {
0867                            if (oldVal.equals(itr.next())) {
0868                                itr.set(newVal);
0869                                result = true;
0870                            }
0871                        }
0872                    }
0873                }
0874                return result;
0875            }
0876
0877            /**
0878             * Returns the starting position of the first occurrence of the specified
0879             * target list within the specified source list, or -1 if there is no
0880             * such occurrence.  More formally, returns the lowest index <tt>i</tt>
0881             * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
0882             * or -1 if there is no such index.  (Returns -1 if
0883             * <tt>target.size() > source.size()</tt>.)
0884             *
0885             * <p>This implementation uses the "brute force" technique of scanning
0886             * over the source list, looking for a match with the target at each
0887             * location in turn.
0888             *
0889             * @param source the list in which to search for the first occurrence
0890             *        of <tt>target</tt>.
0891             * @param target the list to search for as a subList of <tt>source</tt>.
0892             * @return the starting position of the first occurrence of the specified
0893             *         target list within the specified source list, or -1 if there
0894             *         is no such occurrence.
0895             * @since  1.4
0896             */
0897            public static int indexOfSubList(List<?> source, List<?> target) {
0898                int sourceSize = source.size();
0899                int targetSize = target.size();
0900                int maxCandidate = sourceSize - targetSize;
0901
0902                if (sourceSize < INDEXOFSUBLIST_THRESHOLD
0903                        || (source instanceof  RandomAccess && target instanceof  RandomAccess)) {
0904                    nextCand: for (int candidate = 0; candidate <= maxCandidate; candidate++) {
0905                        for (int i = 0, j = candidate; i < targetSize; i++, j++)
0906                            if (!eq(target.get(i), source.get(j)))
0907                                continue nextCand; // Element mismatch, try next cand
0908                        return candidate; // All elements of candidate matched target
0909                    }
0910                } else { // Iterator version of above algorithm
0911                    ListIterator<?> si = source.listIterator();
0912                    nextCand: for (int candidate = 0; candidate <= maxCandidate; candidate++) {
0913                        ListIterator<?> ti = target.listIterator();
0914                        for (int i = 0; i < targetSize; i++) {
0915                            if (!eq(ti.next(), si.next())) {
0916                                // Back up source iterator to next candidate
0917                                for (int j = 0; j < i; j++)
0918                                    si.previous();
0919                                continue nextCand;
0920                            }
0921                        }
0922                        return candidate;
0923                    }
0924                }
0925                return -1; // No candidate matched the target
0926            }
0927
0928            /**
0929             * Returns the starting position of the last occurrence of the specified
0930             * target list within the specified source list, or -1 if there is no such
0931             * occurrence.  More formally, returns the highest index <tt>i</tt>
0932             * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
0933             * or -1 if there is no such index.  (Returns -1 if
0934             * <tt>target.size() > source.size()</tt>.)
0935             *
0936             * <p>This implementation uses the "brute force" technique of iterating
0937             * over the source list, looking for a match with the target at each
0938             * location in turn.
0939             *
0940             * @param source the list in which to search for the last occurrence
0941             *        of <tt>target</tt>.
0942             * @param target the list to search for as a subList of <tt>source</tt>.
0943             * @return the starting position of the last occurrence of the specified
0944             *         target list within the specified source list, or -1 if there
0945             *         is no such occurrence.
0946             * @since  1.4
0947             */
0948            public static int lastIndexOfSubList(List<?> source, List<?> target) {
0949                int sourceSize = source.size();
0950                int targetSize = target.size();
0951                int maxCandidate = sourceSize - targetSize;
0952
0953                if (sourceSize < INDEXOFSUBLIST_THRESHOLD
0954                        || source instanceof  RandomAccess) { // Index access version
0955                    nextCand: for (int candidate = maxCandidate; candidate >= 0; candidate--) {
0956                        for (int i = 0, j = candidate; i < targetSize; i++, j++)
0957                            if (!eq(target.get(i), source.get(j)))
0958                                continue nextCand; // Element mismatch, try next cand
0959                        return candidate; // All elements of candidate matched target
0960                    }
0961                } else { // Iterator version of above algorithm
0962                    if (maxCandidate < 0)
0963                        return -1;
0964                    ListIterator<?> si = source.listIterator(maxCandidate);
0965                    nextCand: for (int candidate = maxCandidate; candidate >= 0; candidate--) {
0966                        ListIterator<?> ti = target.listIterator();
0967                        for (int i = 0; i < targetSize; i++) {
0968                            if (!eq(ti.next(), si.next())) {
0969                                if (candidate != 0) {
0970                                    // Back up source iterator to next candidate
0971                                    for (int j = 0; j <= i + 1; j++)
0972                                        si.previous();
0973                                }
0974                                continue nextCand;
0975                            }
0976                        }
0977                        return candidate;
0978                    }
0979                }
0980                return -1; // No candidate matched the target
0981            }
0982
0983            // Unmodifiable Wrappers
0984
0985            /**
0986             * Returns an unmodifiable view of the specified collection.  This method
0987             * allows modules to provide users with "read-only" access to internal
0988             * collections.  Query operations on the returned collection "read through"
0989             * to the specified collection, and attempts to modify the returned
0990             * collection, whether direct or via its iterator, result in an
0991             * <tt>UnsupportedOperationException</tt>.<p>
0992             *
0993             * The returned collection does <i>not</i> pass the hashCode and equals
0994             * operations through to the backing collection, but relies on
0995             * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods.  This
0996             * is necessary to preserve the contracts of these operations in the case
0997             * that the backing collection is a set or a list.<p>
0998             *
0999             * The returned collection will be serializable if the specified collection
1000             * is serializable.
1001             *
1002             * @param  c the collection for which an unmodifiable view is to be
1003             *	       returned.
1004             * @return an unmodifiable view of the specified collection.
1005             */
1006            public static <T> Collection<T> unmodifiableCollection(
1007                    Collection<? extends T> c) {
1008                return new UnmodifiableCollection<T>(c);
1009            }
1010
1011            /**
1012             * @serial include
1013             */
1014            static class UnmodifiableCollection<E> implements  Collection<E>,
1015                    Serializable {
1016                private static final long serialVersionUID = 1820017752578914078L;
1017
1018                final Collection<? extends E> c;
1019
1020                UnmodifiableCollection(Collection<? extends E> c) {
1021                    if (c == null)
1022                        throw new NullPointerException();
1023                    this .c = c;
1024                }
1025
1026                public int size() {
1027                    return c.size();
1028                }
1029
1030                public boolean isEmpty() {
1031                    return c.isEmpty();
1032                }
1033
1034                public boolean contains(Object o) {
1035                    return c.contains(o);
1036                }
1037
1038                public Object[] toArray() {
1039                    return c.toArray();
1040                }
1041
1042                public <T> T[] toArray(T[] a) {
1043                    return c.toArray(a);
1044                }
1045
1046                public String toString() {
1047                    return c.toString();
1048                }
1049
1050                public Iterator<E> iterator() {
1051                    return new Iterator<E>() {
1052                        private final Iterator<? extends E> i = c.iterator();
1053
1054                        public boolean hasNext() {
1055                            return i.hasNext();
1056                        }
1057
1058                        public E next() {
1059                            return i.next();
1060                        }
1061
1062                        public void remove() {
1063                            throw new UnsupportedOperationException();
1064                        }
1065                    };
1066                }
1067
1068                public boolean add(E e) {
1069                    throw new UnsupportedOperationException();
1070                }
1071
1072                public boolean remove(Object o) {
1073                    throw new UnsupportedOperationException();
1074                }
1075
1076                public boolean containsAll(Collection<?> coll) {
1077                    return c.containsAll(coll);
1078                }
1079
1080                public boolean addAll(Collection<? extends E> coll) {
1081                    throw new UnsupportedOperationException();
1082                }
1083
1084                public boolean removeAll(Collection<?> coll) {
1085                    throw new UnsupportedOperationException();
1086                }
1087
1088                public boolean retainAll(Collection<?> coll) {
1089                    throw new UnsupportedOperationException();
1090                }
1091
1092                public void clear() {
1093                    throw new UnsupportedOperationException();
1094                }
1095            }
1096
1097            /**
1098             * Returns an unmodifiable view of the specified set.  This method allows
1099             * modules to provide users with "read-only" access to internal sets.
1100             * Query operations on the returned set "read through" to the specified
1101             * set, and attempts to modify the returned set, whether direct or via its
1102             * iterator, result in an <tt>UnsupportedOperationException</tt>.<p>
1103             *
1104             * The returned set will be serializable if the specified set
1105             * is serializable.
1106             *
1107             * @param  s the set for which an unmodifiable view is to be returned.
1108             * @return an unmodifiable view of the specified set.
1109             */
1110            public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
1111                return new UnmodifiableSet<T>(s);
1112            }
1113
1114            /**
1115             * @serial include
1116             */
1117            static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
1118                    implements  Set<E>, Serializable {
1119                private static final long serialVersionUID = -9215047833775013803L;
1120
1121                UnmodifiableSet(Set<? extends E> s) {
1122                    super (s);
1123                }
1124
1125                public boolean equals(Object o) {
1126                    return o == this  || c.equals(o);
1127                }
1128
1129                public int hashCode() {
1130                    return c.hashCode();
1131                }
1132            }
1133
1134            /**
1135             * Returns an unmodifiable view of the specified sorted set.  This method
1136             * allows modules to provide users with "read-only" access to internal
1137             * sorted sets.  Query operations on the returned sorted set "read
1138             * through" to the specified sorted set.  Attempts to modify the returned
1139             * sorted set, whether direct, via its iterator, or via its
1140             * <tt>subSet</tt>, <tt>headSet</tt>, or <tt>tailSet</tt> views, result in
1141             * an <tt>UnsupportedOperationException</tt>.<p>
1142             *
1143             * The returned sorted set will be serializable if the specified sorted set
1144             * is serializable.
1145             *
1146             * @param s the sorted set for which an unmodifiable view is to be
1147             *        returned.
1148             * @return an unmodifiable view of the specified sorted set.
1149             */
1150            public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
1151                return new UnmodifiableSortedSet<T>(s);
1152            }
1153
1154            /**
1155             * @serial include
1156             */
1157            static class UnmodifiableSortedSet<E> extends UnmodifiableSet<E>
1158                    implements  SortedSet<E>, Serializable {
1159                private static final long serialVersionUID = -4929149591599911165L;
1160                private final SortedSet<E> ss;
1161
1162                UnmodifiableSortedSet(SortedSet<E> s) {
1163                    super (s);
1164                    ss = s;
1165                }
1166
1167                public Comparator<? super  E> comparator() {
1168                    return ss.comparator();
1169                }
1170
1171                public SortedSet<E> subSet(E fromElement, E toElement) {
1172                    return new UnmodifiableSortedSet<E>(ss.subSet(fromElement,
1173                            toElement));
1174                }
1175
1176                public SortedSet<E> headSet(E toElement) {
1177                    return new UnmodifiableSortedSet<E>(ss.headSet(toElement));
1178                }
1179
1180                public SortedSet<E> tailSet(E fromElement) {
1181                    return new UnmodifiableSortedSet<E>(ss.tailSet(fromElement));
1182                }
1183
1184                public E first() {
1185                    return ss.first();
1186                }
1187
1188                public E last() {
1189                    return ss.last();
1190                }
1191            }
1192
1193            /**
1194             * Returns an unmodifiable view of the specified list.  This method allows
1195             * modules to provide users with "read-only" access to internal
1196             * lists.  Query operations on the returned list "read through" to the
1197             * specified list, and attempts to modify the returned list, whether
1198             * direct or via its iterator, result in an
1199             * <tt>UnsupportedOperationException</tt>.<p>
1200             *
1201             * The returned list will be serializable if the specified list
1202             * is serializable. Similarly, the returned list will implement
1203             * {@link RandomAccess} if the specified list does.
1204             *
1205             * @param  list the list for which an unmodifiable view is to be returned.
1206             * @return an unmodifiable view of the specified list.
1207             */
1208            public static <T> List<T> unmodifiableList(List<? extends T> list) {
1209                return (list instanceof  RandomAccess ? new UnmodifiableRandomAccessList<T>(
1210                        list)
1211                        : new UnmodifiableList<T>(list));
1212            }
1213
1214            /**
1215             * @serial include
1216             */
1217            static class UnmodifiableList<E> extends UnmodifiableCollection<E>
1218                    implements  List<E> {
1219                private static final long serialVersionUID = -283967356065247728L;
1220                final List<? extends E> list;
1221
1222                UnmodifiableList(List<? extends E> list) {
1223                    super (list);
1224                    this .list = list;
1225                }
1226
1227                public boolean equals(Object o) {
1228                    return o == this  || list.equals(o);
1229                }
1230
1231                public int hashCode() {
1232                    return list.hashCode();
1233                }
1234
1235                public E get(int index) {
1236                    return list.get(index);
1237                }
1238
1239                public E set(int index, E element) {
1240                    throw new UnsupportedOperationException();
1241                }
1242
1243                public void add(int index, E element) {
1244                    throw new UnsupportedOperationException();
1245                }
1246
1247                public E remove(int index) {
1248                    throw new UnsupportedOperationException();
1249                }
1250
1251                public int indexOf(Object o) {
1252                    return list.indexOf(o);
1253                }
1254
1255                public int lastIndexOf(Object o) {
1256                    return list.lastIndexOf(o);
1257                }
1258
1259                public boolean addAll(int index, Collection<? extends E> c) {
1260                    throw new UnsupportedOperationException();
1261                }
1262
1263                public ListIterator<E> listIterator() {
1264                    return listIterator(0);
1265                }
1266
1267                public ListIterator<E> listIterator(final int index) {
1268                    return new ListIterator<E>() {
1269                        private final ListIterator<? extends E> i = list
1270                                .listIterator(index);
1271
1272                        public boolean hasNext() {
1273                            return i.hasNext();
1274                        }
1275
1276                        public E next() {
1277                            return i.next();
1278                        }
1279
1280                        public boolean hasPrevious() {
1281                            return i.hasPrevious();
1282                        }
1283
1284                        public E previous() {
1285                            return i.previous();
1286                        }
1287
1288                        public int nextIndex() {
1289                            return i.nextIndex();
1290                        }
1291
1292                        public int previousIndex() {
1293                            return i.previousIndex();
1294                        }
1295
1296                        public void remove() {
1297                            throw new UnsupportedOperationException();
1298                        }
1299
1300                        public void set(E e) {
1301                            throw new UnsupportedOperationException();
1302                        }
1303
1304                        public void add(E e) {
1305                            throw new UnsupportedOperationException();
1306                        }
1307                    };
1308                }
1309
1310                public List<E> subList(int fromIndex, int toIndex) {
1311                    return new UnmodifiableList<E>(list.subList(fromIndex,
1312                            toIndex));
1313                }
1314
1315                /**
1316                 * UnmodifiableRandomAccessList instances are serialized as
1317                 * UnmodifiableList instances to allow them to be deserialized
1318                 * in pre-1.4 JREs (which do not have UnmodifiableRandomAccessList).
1319                 * This method inverts the transformation.  As a beneficial
1320                 * side-effect, it also grafts the RandomAccess marker onto
1321                 * UnmodifiableList instances that were serialized in pre-1.4 JREs.
1322                 *
1323                 * Note: Unfortunately, UnmodifiableRandomAccessList instances
1324                 * serialized in 1.4.1 and deserialized in 1.4 will become
1325                 * UnmodifiableList instances, as this method was missing in 1.4.
1326                 */
1327                private Object readResolve() {
1328                    return (list instanceof  RandomAccess ? new UnmodifiableRandomAccessList<E>(
1329                            list)
1330                            : this );
1331                }
1332            }
1333
1334            /**
1335             * @serial include
1336             */
1337            static class UnmodifiableRandomAccessList<E> extends
1338                    UnmodifiableList<E> implements  RandomAccess {
1339                UnmodifiableRandomAccessList(List<? extends E> list) {
1340                    super (list);
1341                }
1342
1343                public List<E> subList(int fromIndex, int toIndex) {
1344                    return new UnmodifiableRandomAccessList<E>(list.subList(
1345                            fromIndex, toIndex));
1346                }
1347
1348                private static final long serialVersionUID = -2542308836966382001L;
1349
1350                /**
1351                 * Allows instances to be deserialized in pre-1.4 JREs (which do
1352                 * not have UnmodifiableRandomAccessList).  UnmodifiableList has
1353                 * a readResolve method that inverts this transformation upon
1354                 * deserialization.
1355                 */
1356                private Object writeReplace() {
1357                    return new UnmodifiableList<E>(list);
1358                }
1359            }
1360
1361            /**
1362             * Returns an unmodifiable view of the specified map.  This method
1363             * allows modules to provide users with "read-only" access to internal
1364             * maps.  Query operations on the returned map "read through"
1365             * to the specified map, and attempts to modify the returned
1366             * map, whether direct or via its collection views, result in an
1367             * <tt>UnsupportedOperationException</tt>.<p>
1368             *
1369             * The returned map will be serializable if the specified map
1370             * is serializable.
1371             *
1372             * @param  m the map for which an unmodifiable view is to be returned.
1373             * @return an unmodifiable view of the specified map.
1374             */
1375            public static <K, V> Map<K, V> unmodifiableMap(
1376                    Map<? extends K, ? extends V> m) {
1377                return new UnmodifiableMap<K, V>(m);
1378            }
1379
1380            /**
1381             * @serial include
1382             */
1383            private static class UnmodifiableMap<K, V> implements  Map<K, V>,
1384                    Serializable {
1385                private static final long serialVersionUID = -1034234728574286014L;
1386
1387                private final Map<? extends K, ? extends V> m;
1388
1389                UnmodifiableMap(Map<? extends K, ? extends V> m) {
1390                    if (m == null)
1391                        throw new NullPointerException();
1392                    this .m = m;
1393                }
1394
1395                public int size() {
1396                    return m.size();
1397                }
1398
1399                public boolean isEmpty() {
1400                    return m.isEmpty();
1401                }
1402
1403                public boolean containsKey(Object key) {
1404                    return m.containsKey(key);
1405                }
1406
1407                public boolean containsValue(Object val) {
1408                    return m.containsValue(val);
1409                }
1410
1411                public V get(Object key) {
1412                    return m.get(key);
1413                }
1414
1415                public V put(K key, V value) {
1416                    throw new UnsupportedOperationException();
1417                }
1418
1419                public V remove(Object key) {
1420                    throw new UnsupportedOperationException();
1421                }
1422
1423                public void putAll(Map<? extends K, ? extends V> m) {
1424                    throw new UnsupportedOperationException();
1425                }
1426
1427                public void clear() {
1428                    throw new UnsupportedOperationException();
1429                }
1430
1431                private transient Set<K> keySet = null;
1432                private transient Set<Map.Entry<K, V>> entrySet = null;
1433                private transient Collection<V> values = null;
1434
1435                public Set<K> keySet() {
1436                    if (keySet == null)
1437                        keySet = unmodifiableSet(m.keySet());
1438                    return keySet;
1439                }
1440
1441                public Set<Map.Entry<K, V>> entrySet() {
1442                    if (entrySet == null)
1443                        entrySet = new UnmodifiableEntrySet<K, V>(m.entrySet());
1444                    return entrySet;
1445                }
1446
1447                public Collection<V> values() {
1448                    if (values == null)
1449                        values = unmodifiableCollection(m.values());
1450                    return values;
1451                }
1452
1453                public boolean equals(Object o) {
1454                    return o == this  || m.equals(o);
1455                }
1456
1457                public int hashCode() {
1458                    return m.hashCode();
1459                }
1460
1461                public String toString() {
1462                    return m.toString();
1463                }
1464
1465                /**
1466                 * We need this class in addition to UnmodifiableSet as
1467                 * Map.Entries themselves permit modification of the backing Map
1468                 * via their setValue operation.  This class is subtle: there are
1469                 * many possible attacks that must be thwarted.
1470                 *
1471                 * @serial include
1472                 */
1473                static class UnmodifiableEntrySet<K, V> extends
1474                        UnmodifiableSet<Map.Entry<K, V>> {
1475                    private static final long serialVersionUID = 7854390611657943733L;
1476
1477                    UnmodifiableEntrySet(
1478                            Set<? extends Map.Entry<? extends K, ? extends V>> s) {
1479                        super ((Set) s);
1480                    }
1481
1482                    public Iterator<Map.Entry<K, V>> iterator() {
1483                        return new Iterator<Map.Entry<K, V>>() {
1484                            private final Iterator<? extends Map.Entry<? extends K, ? extends V>> i = c
1485                                    .iterator();
1486
1487                            public boolean hasNext() {
1488                                return i.hasNext();
1489                            }
1490
1491                            public Map.Entry<K, V> next() {
1492                                return new UnmodifiableEntry<K, V>(i.next());
1493                            }
1494
1495                            public void remove() {
1496                                throw new UnsupportedOperationException();
1497                            }
1498                        };
1499                    }
1500
1501                    public Object[] toArray() {
1502                        Object[] a = c.toArray();
1503                        for (int i = 0; i < a.length; i++)
1504                            a[i] = new UnmodifiableEntry<K, V>(
1505                                    (Map.Entry<K, V>) a[i]);
1506                        return a;
1507                    }
1508
1509                    public <T> T[] toArray(T[] a) {
1510                        // We don't pass a to c.toArray, to avoid window of
1511                        // vulnerability wherein an unscrupulous multithreaded client
1512                        // could get his hands on raw (unwrapped) Entries from c.
1513                        Object[] arr = c.toArray(a.length == 0 ? a : Arrays
1514                                .copyOf(a, 0));
1515
1516                        for (int i = 0; i < arr.length; i++)
1517                            arr[i] = new UnmodifiableEntry<K, V>(
1518                                    (Map.Entry<K, V>) arr[i]);
1519
1520                        if (arr.length > a.length)
1521                            return (T[]) arr;
1522
1523                        System.arraycopy(arr, 0, a, 0, arr.length);
1524                        if (a.length > arr.length)
1525                            a[arr.length] = null;
1526                        return a;
1527                    }
1528
1529                    /**
1530                     * This method is overridden to protect the backing set against
1531                     * an object with a nefarious equals function that senses
1532                     * that the equality-candidate is Map.Entry and calls its
1533                     * setValue method.
1534                     */
1535                    public boolean contains(Object o) {
1536                        if (!(o instanceof  Map.Entry))
1537                            return false;
1538                        return c.contains(new UnmodifiableEntry<K, V>(
1539                                (Map.Entry<K, V>) o));
1540                    }
1541
1542                    /**
1543                     * The next two methods are overridden to protect against
1544                     * an unscrupulous List whose contains(Object o) method senses
1545                     * when o is a Map.Entry, and calls o.setValue.
1546                     */
1547                    public boolean containsAll(Collection<?> coll) {
1548                        Iterator<?> e = coll.iterator();
1549                        while (e.hasNext())
1550                            if (!contains(e.next())) // Invokes safe contains() above
1551                                return false;
1552                        return true;
1553                    }
1554
1555                    public boolean equals(Object o) {
1556                        if (o == this )
1557                            return true;
1558
1559                        if (!(o instanceof  Set))
1560                            return false;
1561                        Set s = (Set) o;
1562                        if (s.size() != c.size())
1563                            return false;
1564                        return containsAll(s); // Invokes safe containsAll() above
1565                    }
1566
1567                    /**
1568                     * This "wrapper class" serves two purposes: it prevents
1569                     * the client from modifying the backing Map, by short-circuiting
1570                     * the setValue method, and it protects the backing Map against
1571                     * an ill-behaved Map.Entry that attempts to modify another
1572                     * Map Entry when asked to perform an equality check.
1573                     */
1574                    private static class UnmodifiableEntry<K, V> implements 
1575                            Map.Entry<K, V> {
1576                        private Map.Entry<? extends K, ? extends V> e;
1577
1578                        UnmodifiableEntry(Map.Entry<? extends K, ? extends V> e) {
1579                            this .e = e;
1580                        }
1581
1582                        public K getKey() {
1583                            return e.getKey();
1584                        }
1585
1586                        public V getValue() {
1587                            return e.getValue();
1588                        }
1589
1590                        public V setValue(V value) {
1591                            throw new UnsupportedOperationException();
1592                        }
1593
1594                        public int hashCode() {
1595                            return e.hashCode();
1596                        }
1597
1598                        public boolean equals(Object o) {
1599                            if (!(o instanceof  Map.Entry))
1600                                return false;
1601                            Map.Entry t = (Map.Entry) o;
1602                            return eq(e.getKey(), t.getKey())
1603                                    && eq(e.getValue(), t.getValue());
1604                        }
1605
1606                        public String toString() {
1607                            return e.toString();
1608                        }
1609                    }
1610                }
1611            }
1612
1613            /**
1614             * Returns an unmodifiable view of the specified sorted map.  This method
1615             * allows modules to provide users with "read-only" access to internal
1616             * sorted maps.  Query operations on the returned sorted map "read through"
1617             * to the specified sorted map.  Attempts to modify the returned
1618             * sorted map, whether direct, via its collection views, or via its
1619             * <tt>subMap</tt>, <tt>headMap</tt>, or <tt>tailMap</tt> views, result in
1620             * an <tt>UnsupportedOperationException</tt>.<p>
1621             *
1622             * The returned sorted map will be serializable if the specified sorted map
1623             * is serializable.
1624             *
1625             * @param m the sorted map for which an unmodifiable view is to be
1626             *        returned.
1627             * @return an unmodifiable view of the specified sorted map.
1628             */
1629            public static <K, V> SortedMap<K, V> unmodifiableSortedMap(
1630                    SortedMap<K, ? extends V> m) {
1631                return new UnmodifiableSortedMap<K, V>(m);
1632            }
1633
1634            /**
1635             * @serial include
1636             */
1637            static class UnmodifiableSortedMap<K, V> extends
1638                    UnmodifiableMap<K, V> implements  SortedMap<K, V>,
1639                    Serializable {
1640                private static final long serialVersionUID = -8806743815996713206L;
1641
1642                private final SortedMap<K, ? extends V> sm;
1643
1644                UnmodifiableSortedMap(SortedMap<K, ? extends V> m) {
1645                    super (m);
1646                    sm = m;
1647                }
1648
1649                public Comparator<? super  K> comparator() {
1650                    return sm.comparator();
1651                }
1652
1653                public SortedMap<K, V> subMap(K fromKey, K toKey) {
1654                    return new UnmodifiableSortedMap<K, V>(sm.subMap(fromKey,
1655                            toKey));
1656                }
1657
1658                public SortedMap<K, V> headMap(K toKey) {
1659                    return new UnmodifiableSortedMap<K, V>(sm.headMap(toKey));
1660                }
1661
1662                public SortedMap<K, V> tailMap(K fromKey) {
1663                    return new UnmodifiableSortedMap<K, V>(sm.tailMap(fromKey));
1664                }
1665
1666                public K firstKey() {
1667                    return sm.firstKey();
1668                }
1669
1670                public K lastKey() {
1671                    return sm.lastKey();
1672                }
1673            }
1674
1675            // Synch Wrappers
1676
1677            /**
1678             * Returns a synchronized (thread-safe) collection backed by the specified
1679             * collection.  In order to guarantee serial access, it is critical that
1680             * <strong>all</strong> access to the backing collection is accomplished
1681             * through the returned collection.<p>
1682             *
1683             * It is imperative that the user manually synchronize on the returned
1684             * collection when iterating over it:
1685             * <pre>
1686             *  Collection c = Collections.synchronizedCollection(myCollection);
1687             *     ...
1688             *  synchronized(c) {
1689             *      Iterator i = c.iterator(); // Must be in the synchronized block
1690             *      while (i.hasNext())
1691             *         foo(i.next());
1692             *  }
1693             * </pre>
1694             * Failure to follow this advice may result in non-deterministic behavior.
1695             *
1696             * <p>The returned collection does <i>not</i> pass the <tt>hashCode</tt>
1697             * and <tt>equals</tt> operations through to the backing collection, but
1698             * relies on <tt>Object</tt>'s equals and hashCode methods.  This is
1699             * necessary to preserve the contracts of these operations in the case
1700             * that the backing collection is a set or a list.<p>
1701             *
1702             * The returned collection will be serializable if the specified collection
1703             * is serializable.
1704             *
1705             * @param  c the collection to be "wrapped" in a synchronized collection.
1706             * @return a synchronized view of the specified collection.
1707             */
1708            public static <T> Collection<T> synchronizedCollection(
1709                    Collection<T> c) {
1710                return new SynchronizedCollection<T>(c);
1711            }
1712
1713            static <T> Collection<T> synchronizedCollection(Collection<T> c,
1714                    Object mutex) {
1715                return new SynchronizedCollection<T>(c, mutex);
1716            }
1717
1718            /**
1719             * @serial include
1720             */
1721            static class SynchronizedCollection<E> implements  Collection<E>,
1722                    Serializable {
1723                private static final long serialVersionUID = 3053995032091335093L;
1724
1725                final Collection<E> c; // Backing Collection
1726                final Object mutex; // Object on which to synchronize
1727
1728                SynchronizedCollection(Collection<E> c) {
1729                    if (c == null)
1730                        throw new NullPointerException();
1731                    this .c = c;
1732                    mutex = this ;
1733                }
1734
1735                SynchronizedCollection(Collection<E> c, Object mutex) {
1736                    this .c = c;
1737                    this .mutex = mutex;
1738                }
1739
1740                public int size() {
1741                    synchronized (mutex) {
1742                        return c.size();
1743                    }
1744                }
1745
1746                public boolean isEmpty() {
1747                    synchronized (mutex) {
1748                        return c.isEmpty();
1749                    }
1750                }
1751
1752                public boolean contains(Object o) {
1753                    synchronized (mutex) {
1754                        return c.contains(o);
1755                    }
1756                }
1757
1758                public Object[] toArray() {
1759                    synchronized (mutex) {
1760                        return c.toArray();
1761                    }
1762                }
1763
1764                public <T> T[] toArray(T[] a) {
1765                    synchronized (mutex) {
1766                        return c.toArray(a);
1767                    }
1768                }
1769
1770                public Iterator<E> iterator() {
1771                    return c.iterator(); // Must be manually synched by user!
1772                }
1773
1774                public boolean add(E e) {
1775                    synchronized (mutex) {
1776                        return c.add(e);
1777                    }
1778                }
1779
1780                public boolean remove(Object o) {
1781                    synchronized (mutex) {
1782                        return c.remove(o);
1783                    }
1784                }
1785
1786                public boolean containsAll(Collection<?> coll) {
1787                    synchronized (mutex) {
1788                        return c.containsAll(coll);
1789                    }
1790                }
1791
1792                public boolean addAll(Collection<? extends E> coll) {
1793                    synchronized (mutex) {
1794                        return c.addAll(coll);
1795                    }
1796                }
1797
1798                public boolean removeAll(Collection<?> coll) {
1799                    synchronized (mutex) {
1800                        return c.removeAll(coll);
1801                    }
1802                }
1803
1804                public boolean retainAll(Collection<?> coll) {
1805                    synchronized (mutex) {
1806                        return c.retainAll(coll);
1807                    }
1808                }
1809
1810                public void clear() {
1811                    synchronized (mutex) {
1812                        c.clear();
1813                    }
1814                }
1815
1816                public String toString() {
1817                    synchronized (mutex) {
1818                        return c.toString();
1819                    }
1820                }
1821
1822                private void writeObject(ObjectOutputStream s)
1823                        throws IOException {
1824                    synchronized (mutex) {
1825                        s.defaultWriteObject();
1826                    }
1827                }
1828            }
1829
1830            /**
1831             * Returns a synchronized (thread-safe) set backed by the specified
1832             * set.  In order to guarantee serial access, it is critical that
1833             * <strong>all</strong> access to the backing set is accomplished
1834             * through the returned set.<p>
1835             *
1836             * It is imperative that the user manually synchronize on the returned
1837             * set when iterating over it:
1838             * <pre>
1839             *  Set s = Collections.synchronizedSet(new HashSet());
1840             *      ...
1841             *  synchronized(s) {
1842             *      Iterator i = s.iterator(); // Must be in the synchronized block
1843             *      while (i.hasNext())
1844             *          foo(i.next());
1845             *  }
1846             * </pre>
1847             * Failure to follow this advice may result in non-deterministic behavior.
1848             *
1849             * <p>The returned set will be serializable if the specified set is
1850             * serializable.
1851             *
1852             * @param  s the set to be "wrapped" in a synchronized set.
1853             * @return a synchronized view of the specified set.
1854             */
1855            public static <T> Set<T> synchronizedSet(Set<T> s) {
1856                return new SynchronizedSet<T>(s);
1857            }
1858
1859            static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) {
1860                return new SynchronizedSet<T>(s, mutex);
1861            }
1862
1863            /**
1864             * @serial include
1865             */
1866            static class SynchronizedSet<E> extends SynchronizedCollection<E>
1867                    implements  Set<E> {
1868                private static final long serialVersionUID = 487447009682186044L;
1869
1870                SynchronizedSet(Set<E> s) {
1871                    super (s);
1872                }
1873
1874                SynchronizedSet(Set<E> s, Object mutex) {
1875                    super (s, mutex);
1876                }
1877
1878                public boolean equals(Object o) {
1879                    synchronized (mutex) {
1880                        return c.equals(o);
1881                    }
1882                }
1883
1884                public int hashCode() {
1885                    synchronized (mutex) {
1886                        return c.hashCode();
1887                    }
1888                }
1889            }
1890
1891            /**
1892             * Returns a synchronized (thread-safe) sorted set backed by the specified
1893             * sorted set.  In order to guarantee serial access, it is critical that
1894             * <strong>all</strong> access to the backing sorted set is accomplished
1895             * through the returned sorted set (or its views).<p>
1896             *
1897             * It is imperative that the user manually synchronize on the returned
1898             * sorted set when iterating over it or any of its <tt>subSet</tt>,
1899             * <tt>headSet</tt>, or <tt>tailSet</tt> views.
1900             * <pre>
1901             *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
1902             *      ...
1903             *  synchronized(s) {
1904             *      Iterator i = s.iterator(); // Must be in the synchronized block
1905             *      while (i.hasNext())
1906             *          foo(i.next());
1907             *  }
1908             * </pre>
1909             * or:
1910             * <pre>
1911             *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
1912             *  SortedSet s2 = s.headSet(foo);
1913             *      ...
1914             *  synchronized(s) {  // Note: s, not s2!!!
1915             *      Iterator i = s2.iterator(); // Must be in the synchronized block
1916             *      while (i.hasNext())
1917             *          foo(i.next());
1918             *  }
1919             * </pre>
1920             * Failure to follow this advice may result in non-deterministic behavior.
1921             *
1922             * <p>The returned sorted set will be serializable if the specified
1923             * sorted set is serializable.
1924             *
1925             * @param  s the sorted set to be "wrapped" in a synchronized sorted set.
1926             * @return a synchronized view of the specified sorted set.
1927             */
1928            public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) {
1929                return new SynchronizedSortedSet<T>(s);
1930            }
1931
1932            /**
1933             * @serial include
1934             */
1935            static class SynchronizedSortedSet<E> extends SynchronizedSet<E>
1936                    implements  SortedSet<E> {
1937                private static final long serialVersionUID = 8695801310862127406L;
1938
1939                final private SortedSet<E> ss;
1940
1941                SynchronizedSortedSet(SortedSet<E> s) {
1942                    super (s);
1943                    ss = s;
1944                }
1945
1946                SynchronizedSortedSet(SortedSet<E> s, Object mutex) {
1947                    super (s, mutex);
1948                    ss = s;
1949                }
1950
1951                public Comparator<? super  E> comparator() {
1952                    synchronized (mutex) {
1953                        return ss.comparator();
1954                    }
1955                }
1956
1957                public SortedSet<E> subSet(E fromElement, E toElement) {
1958                    synchronized (mutex) {
1959                        return new SynchronizedSortedSet<E>(ss.subSet(
1960                                fromElement, toElement), mutex);
1961                    }
1962                }
1963
1964                public SortedSet<E> headSet(E toElement) {
1965                    synchronized (mutex) {
1966                        return new SynchronizedSortedSet<E>(ss
1967                                .headSet(toElement), mutex);
1968                    }
1969                }
1970
1971                public SortedSet<E> tailSet(E fromElement) {
1972                    synchronized (mutex) {
1973                        return new SynchronizedSortedSet<E>(ss
1974                                .tailSet(fromElement), mutex);
1975                    }
1976                }
1977
1978                public E first() {
1979                    synchronized (mutex) {
1980                        return ss.first();
1981                    }
1982                }
1983
1984                public E last() {
1985                    synchronized (mutex) {
1986                        return ss.last();
1987                    }
1988                }
1989            }
1990
1991            /**
1992             * Returns a synchronized (thread-safe) list backed by the specified
1993             * list.  In order to guarantee serial access, it is critical that
1994             * <strong>all</strong> access to the backing list is accomplished
1995             * through the returned list.<p>
1996             *
1997             * It is imperative that the user manually synchronize on the returned
1998             * list when iterating over it:
1999             * <pre>
2000             *  List list = Collections.synchronizedList(new ArrayList());
2001             *      ...
2002             *  synchronized(list) {
2003             *      Iterator i = list.iterator(); // Must be in synchronized block
2004             *      while (i.hasNext())
2005             *          foo(i.next());
2006             *  }
2007             * </pre>
2008             * Failure to follow this advice may result in non-deterministic behavior.
2009             *
2010             * <p>The returned list will be serializable if the specified list is
2011             * serializable.
2012             *
2013             * @param  list the list to be "wrapped" in a synchronized list.
2014             * @return a synchronized view of the specified list.
2015             */
2016            public static <T> List<T> synchronizedList(List<T> list) {
2017                return (list instanceof  RandomAccess ? new SynchronizedRandomAccessList<T>(
2018                        list)
2019                        : new SynchronizedList<T>(list));
2020            }
2021
2022            static <T> List<T> synchronizedList(List<T> list, Object mutex) {
2023                return (list instanceof  RandomAccess ? new SynchronizedRandomAccessList<T>(
2024                        list, mutex)
2025                        : new SynchronizedList<T>(list, mutex));
2026            }
2027
2028            /**
2029             * @serial include
2030             */
2031            static class SynchronizedList<E> extends SynchronizedCollection<E>
2032                    implements  List<E> {
2033                private static final long serialVersionUID = -7754090372962971524L;
2034
2035                final List<E> list;
2036
2037                SynchronizedList(List<E> list) {
2038                    super (list);
2039                    this .list = list;
2040                }
2041
2042                SynchronizedList(List<E> list, Object mutex) {
2043                    super (list, mutex);
2044                    this .list = list;
2045                }
2046
2047                public boolean equals(Object o) {
2048                    synchronized (mutex) {
2049                        return list.equals(o);
2050                    }
2051                }
2052
2053                public int hashCode() {
2054                    synchronized (mutex) {
2055                        return list.hashCode();
2056                    }
2057                }
2058
2059                public E get(int index) {
2060                    synchronized (mutex) {
2061                        return list.get(index);
2062                    }
2063                }
2064
2065                public E set(int index, E element) {
2066                    synchronized (mutex) {
2067                        return list.set(index, element);
2068                    }
2069                }
2070
2071                public void add(int index, E element) {
2072                    synchronized (mutex) {
2073                        list.add(index, element);
2074                    }
2075                }
2076
2077                public E remove(int index) {
2078                    synchronized (mutex) {
2079                        return list.remove(index);
2080                    }
2081                }
2082
2083                public int indexOf(Object o) {
2084                    synchronized (mutex) {
2085                        return list.indexOf(o);
2086                    }
2087                }
2088
2089                public int lastIndexOf(Object o) {
2090                    synchronized (mutex) {
2091                        return list.lastIndexOf(o);
2092                    }
2093                }
2094
2095                public boolean addAll(int index, Collection<? extends E> c) {
2096                    synchronized (mutex) {
2097                        return list.addAll(index, c);
2098                    }
2099                }
2100
2101                public ListIterator<E> listIterator() {
2102                    return list.listIterator(); // Must be manually synched by user
2103                }
2104
2105                public ListIterator<E> listIterator(int index) {
2106                    return list.listIterator(index); // Must be manually synched by user
2107                }
2108
2109                public List<E> subList(int fromIndex, int toIndex) {
2110                    synchronized (mutex) {
2111                        return new SynchronizedList<E>(list.subList(fromIndex,
2112                                toIndex), mutex);
2113                    }
2114                }
2115
2116                /**
2117                 * SynchronizedRandomAccessList instances are serialized as
2118                 * SynchronizedList instances to allow them to be deserialized
2119                 * in pre-1.4 JREs (which do not have SynchronizedRandomAccessList).
2120                 * This method inverts the transformation.  As a beneficial
2121                 * side-effect, it also grafts the RandomAccess marker onto
2122                 * SynchronizedList instances that were serialized in pre-1.4 JREs.
2123                 *
2124                 * Note: Unfortunately, SynchronizedRandomAccessList instances
2125                 * serialized in 1.4.1 and deserialized in 1.4 will become
2126                 * SynchronizedList instances, as this method was missing in 1.4.
2127                 */
2128                private Object readResolve() {
2129                    return (list instanceof  RandomAccess ? new SynchronizedRandomAccessList<E>(
2130                            list)
2131                            : this );
2132                }
2133            }
2134
2135            /**
2136             * @serial include
2137             */
2138            static class SynchronizedRandomAccessList<E> extends
2139                    SynchronizedList<E> implements  RandomAccess {
2140
2141                SynchronizedRandomAccessList(List<E> list) {
2142                    super (list);
2143                }
2144
2145                SynchronizedRandomAccessList(List<E> list, Object mutex) {
2146                    super (list, mutex);
2147                }
2148
2149                public List<E> subList(int fromIndex, int toIndex) {
2150                    synchronized (mutex) {
2151                        return new SynchronizedRandomAccessList<E>(list
2152                                .subList(fromIndex, toIndex), mutex);
2153                    }
2154                }
2155
2156                private static final long serialVersionUID = 1530674583602358482L;
2157
2158                /**
2159                 * Allows instances to be deserialized in pre-1.4 JREs (which do
2160                 * not have SynchronizedRandomAccessList).  SynchronizedList has
2161                 * a readResolve method that inverts this transformation upon
2162                 * deserialization.
2163                 */
2164                private Object writeReplace() {
2165                    return new SynchronizedList<E>(list);
2166                }
2167            }
2168
2169            /**
2170             * Returns a synchronized (thread-safe) map backed by the specified
2171             * map.  In order to guarantee serial access, it is critical that
2172             * <strong>all</strong> access to the backing map is accomplished
2173             * through the returned map.<p>
2174             *
2175             * It is imperative that the user manually synchronize on the returned
2176             * map when iterating over any of its collection views:
2177             * <pre>
2178             *  Map m = Collections.synchronizedMap(new HashMap());
2179             *      ...
2180             *  Set s = m.keySet();  // Needn't be in synchronized block
2181             *      ...
2182             *  synchronized(m) {  // Synchronizing on m, not s!
2183             *      Iterator i = s.iterator(); // Must be in synchronized block
2184             *      while (i.hasNext())
2185             *          foo(i.next());
2186             *  }
2187             * </pre>
2188             * Failure to follow this advice may result in non-deterministic behavior.
2189             *
2190             * <p>The returned map will be serializable if the specified map is
2191             * serializable.
2192             *
2193             * @param  m the map to be "wrapped" in a synchronized map.
2194             * @return a synchronized view of the specified map.
2195             */
2196            public static <K, V> Map<K, V> synchronizedMap(Map<K, V> m) {
2197                return new SynchronizedMap<K, V>(m);
2198            }
2199
2200            /**
2201             * @serial include
2202             */
2203            private static class SynchronizedMap<K, V> implements  Map<K, V>,
2204                    Serializable {
2205                private static final long serialVersionUID = 1978198479659022715L;
2206
2207                private final Map<K, V> m; // Backing Map
2208                final Object mutex; // Object on which to synchronize
2209
2210                SynchronizedMap(Map<K, V> m) {
2211                    if (m == null)
2212                        throw new NullPointerException();
2213                    this .m = m;
2214                    mutex = this ;
2215                }
2216
2217                SynchronizedMap(Map<K, V> m, Object mutex) {
2218                    this .m = m;
2219                    this .mutex = mutex;
2220                }
2221
2222                public int size() {
2223                    synchronized (mutex) {
2224                        return m.size();
2225                    }
2226                }
2227
2228                public boolean isEmpty() {
2229                    synchronized (mutex) {
2230                        return m.isEmpty();
2231                    }
2232                }
2233
2234                public boolean containsKey(Object key) {
2235                    synchronized (mutex) {
2236                        return m.containsKey(key);
2237                    }
2238                }
2239
2240                public boolean containsValue(Object value) {
2241                    synchronized (mutex) {
2242                        return m.containsValue(value);
2243                    }
2244                }
2245
2246                public V get(Object key) {
2247                    synchronized (mutex) {
2248                        return m.get(key);
2249                    }
2250                }
2251
2252                public V put(K key, V value) {
2253                    synchronized (mutex) {
2254                        return m.put(key, value);
2255                    }
2256                }
2257
2258                public V remove(Object key) {
2259                    synchronized (mutex) {
2260                        return m.remove(key);
2261                    }
2262                }
2263
2264                public void putAll(Map<? extends K, ? extends V> map) {
2265                    synchronized (mutex) {
2266                        m.putAll(map);
2267                    }
2268                }
2269
2270                public void clear() {
2271                    synchronized (mutex) {
2272                        m.clear();
2273                    }
2274                }
2275
2276                private transient Set<K> keySet = null;
2277                private transient Set<Map.Entry<K, V>> entrySet = null;
2278                private transient Collection<V> values = null;
2279
2280                public Set<K> keySet() {
2281                    synchronized (mutex) {
2282                        if (keySet == null)
2283                            keySet = new SynchronizedSet<K>(m.keySet(), mutex);
2284                        return keySet;
2285                    }
2286                }
2287
2288                public Set<Map.Entry<K, V>> entrySet() {
2289                    synchronized (mutex) {
2290                        if (entrySet == null)
2291                            entrySet = new SynchronizedSet<Map.Entry<K, V>>(m
2292                                    .entrySet(), mutex);
2293                        return entrySet;
2294                    }
2295                }
2296
2297                public Collection<V> values() {
2298                    synchronized (mutex) {
2299                        if (values == null)
2300                            values = new SynchronizedCollection<V>(m.values(),
2301                                    mutex);
2302                        return values;
2303                    }
2304                }
2305
2306                public boolean equals(Object o) {
2307                    synchronized (mutex) {
2308                        return m.equals(o);
2309                    }
2310                }
2311
2312                public int hashCode() {
2313                    synchronized (mutex) {
2314                        return m.hashCode();
2315                    }
2316                }
2317
2318                public String toString() {
2319                    synchronized (mutex) {
2320                        return m.toString();
2321                    }
2322                }
2323
2324                private void writeObject(ObjectOutputStream s)
2325                        throws IOException {
2326                    synchronized (mutex) {
2327                        s.defaultWriteObject();
2328                    }
2329                }
2330            }
2331
2332            /**
2333             * Returns a synchronized (thread-safe) sorted map backed by the specified
2334             * sorted map.  In order to guarantee serial access, it is critical that
2335             * <strong>all</strong> access to the backing sorted map is accomplished
2336             * through the returned sorted map (or its views).<p>
2337             *
2338             * It is imperative that the user manually synchronize on the returned
2339             * sorted map when iterating over any of its collection views, or the
2340             * collections views of any of its <tt>subMap</tt>, <tt>headMap</tt> or
2341             * <tt>tailMap</tt> views.
2342             * <pre>
2343             *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2344             *      ...
2345             *  Set s = m.keySet();  // Needn't be in synchronized block
2346             *      ...
2347             *  synchronized(m) {  // Synchronizing on m, not s!
2348             *      Iterator i = s.iterator(); // Must be in synchronized block
2349             *      while (i.hasNext())
2350             *          foo(i.next());
2351             *  }
2352             * </pre>
2353             * or:
2354             * <pre>
2355             *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2356             *  SortedMap m2 = m.subMap(foo, bar);
2357             *      ...
2358             *  Set s2 = m2.keySet();  // Needn't be in synchronized block
2359             *      ...
2360             *  synchronized(m) {  // Synchronizing on m, not m2 or s2!
2361             *      Iterator i = s.iterator(); // Must be in synchronized block
2362             *      while (i.hasNext())
2363             *          foo(i.next());
2364             *  }
2365             * </pre>
2366             * Failure to follow this advice may result in non-deterministic behavior.
2367             *
2368             * <p>The returned sorted map will be serializable if the specified
2369             * sorted map is serializable.
2370             *
2371             * @param  m the sorted map to be "wrapped" in a synchronized sorted map.
2372             * @return a synchronized view of the specified sorted map.
2373             */
2374            public static <K, V> SortedMap<K, V> synchronizedSortedMap(
2375                    SortedMap<K, V> m) {
2376                return new SynchronizedSortedMap<K, V>(m);
2377            }
2378
2379            /**
2380             * @serial include
2381             */
2382            static class SynchronizedSortedMap<K, V> extends
2383                    SynchronizedMap<K, V> implements  SortedMap<K, V> {
2384                private static final long serialVersionUID = -8798146769416483793L;
2385
2386                private final SortedMap<K, V> sm;
2387
2388                SynchronizedSortedMap(SortedMap<K, V> m) {
2389                    super (m);
2390                    sm = m;
2391                }
2392
2393                SynchronizedSortedMap(SortedMap<K, V> m, Object mutex) {
2394                    super (m, mutex);
2395                    sm = m;
2396                }
2397
2398                public Comparator<? super  K> comparator() {
2399                    synchronized (mutex) {
2400                        return sm.comparator();
2401                    }
2402                }
2403
2404                public SortedMap<K, V> subMap(K fromKey, K toKey) {
2405                    synchronized (mutex) {
2406                        return new SynchronizedSortedMap<K, V>(sm.subMap(
2407                                fromKey, toKey), mutex);
2408                    }
2409                }
2410
2411                public SortedMap<K, V> headMap(K toKey) {
2412                    synchronized (mutex) {
2413                        return new SynchronizedSortedMap<K, V>(sm
2414                                .headMap(toKey), mutex);
2415                    }
2416                }
2417
2418                public SortedMap<K, V> tailMap(K fromKey) {
2419                    synchronized (mutex) {
2420                        return new SynchronizedSortedMap<K, V>(sm
2421                                .tailMap(fromKey), mutex);
2422                    }
2423                }
2424
2425                public K firstKey() {
2426                    synchronized (mutex) {
2427                        return sm.firstKey();
2428                    }
2429                }
2430
2431                public K lastKey() {
2432                    synchronized (mutex) {
2433                        return sm.lastKey();
2434                    }
2435                }
2436            }
2437
2438            // Dynamically typesafe collection wrappers
2439
2440            /**
2441             * Returns a dynamically typesafe view of the specified collection.  Any
2442             * attempt to insert an element of the wrong type will result in an
2443             * immediate <tt>ClassCastException</tt>.  Assuming a collection contains
2444             * no incorrectly typed elements prior to the time a dynamically typesafe
2445             * view is generated, and that all subsequent access to the collection
2446             * takes place through the view, it is <i>guaranteed</i> that the
2447             * collection cannot contain an incorrectly typed element.
2448             *
2449             * <p>The generics mechanism in the language provides compile-time
2450             * (static) type checking, but it is possible to defeat this mechanism
2451             * with unchecked casts.  Usually this is not a problem, as the compiler
2452             * issues warnings on all such unchecked operations.  There are, however,
2453             * times when static type checking alone is not sufficient.  For example,
2454             * suppose a collection is passed to a third-party library and it is
2455             * imperative that the library code not corrupt the collection by
2456             * inserting an element of the wrong type.
2457             *
2458             * <p>Another use of dynamically typesafe views is debugging.  Suppose a
2459             * program fails with a <tt>ClassCastException</tt>, indicating that an
2460             * incorrectly typed element was put into a parameterized collection.
2461             * Unfortunately, the exception can occur at any time after the erroneous
2462             * element is inserted, so it typically provides little or no information
2463             * as to the real source of the problem.  If the problem is reproducible,
2464             * one can quickly determine its source by temporarily modifying the
2465             * program to wrap the collection with a dynamically typesafe view.
2466             * For example, this declaration:
2467             * <pre>
2468             *     Collection&lt;String&gt; c = new HashSet&lt;String&gt;();
2469             * </pre>
2470             * may be replaced temporarily by this one:
2471             * <pre>
2472             *     Collection&lt;String&gt; c = Collections.checkedCollection(
2473             *         new HashSet&lt;String&gt;(), String.class);
2474             * </pre>
2475             * Running the program again will cause it to fail at the point where
2476             * an incorrectly typed element is inserted into the collection, clearly
2477             * identifying the source of the problem.  Once the problem is fixed, the
2478             * modified declaration may be reverted back to the original.
2479             *
2480             * <p>The returned collection does <i>not</i> pass the hashCode and equals
2481             * operations through to the backing collection, but relies on
2482             * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods.  This
2483             * is necessary to preserve the contracts of these operations in the case
2484             * that the backing collection is a set or a list.
2485             *
2486             * <p>The returned collection will be serializable if the specified
2487             * collection is serializable.
2488             *
2489             * @param c the collection for which a dynamically typesafe view is to be
2490             *             returned
2491             * @param type the type of element that <tt>c</tt> is permitted to hold
2492             * @return a dynamically typesafe view of the specified collection
2493             * @since 1.5
2494             */
2495            public static <E> Collection<E> checkedCollection(Collection<E> c,
2496                    Class<E> type) {
2497                return new CheckedCollection<E>(c, type);
2498            }
2499
2500            /**
2501             * @serial include
2502             */
2503            static class CheckedCollection<E> implements  Collection<E>,
2504                    Serializable {
2505                private static final long serialVersionUID = 1578914078182001775L;
2506
2507                final Collection<E> c;
2508                final Class<E> type;
2509
2510                void typeCheck(Object o) {
2511                    if (!type.isInstance(o))
2512                        throw new ClassCastException("Attempt to insert "
2513                                + o.getClass()
2514                                + " element into collection with element type "
2515                                + type);
2516                }
2517
2518                CheckedCollection(Collection<E> c, Class<E> type) {
2519                    if (c == null || type == null)
2520                        throw new NullPointerException();
2521                    this .c = c;
2522                    this .type = type;
2523                }
2524
2525                public int size() {
2526                    return c.size();
2527                }
2528
2529                public boolean isEmpty() {
2530                    return c.isEmpty();
2531                }
2532
2533                public boolean contains(Object o) {
2534                    return c.contains(o);
2535                }
2536
2537                public Object[] toArray() {
2538                    return c.toArray();
2539                }
2540
2541                public <T> T[] toArray(T[] a) {
2542                    return c.toArray(a);
2543                }
2544
2545                public String toString() {
2546                    return c.toString();
2547                }
2548
2549                public boolean remove(Object o) {
2550                    return c.remove(o);
2551                }
2552
2553                public boolean containsAll(Collection<?> coll) {
2554                    return c.containsAll(coll);
2555                }
2556
2557                public boolean removeAll(Collection<?> coll) {
2558                    return c.removeAll(coll);
2559                }
2560
2561                public boolean retainAll(Collection<?> coll) {
2562                    return c.retainAll(coll);
2563                }
2564
2565                public void clear() {
2566                    c.clear();
2567                }
2568
2569                public Iterator<E> iterator() {
2570                    return new Iterator<E>() {
2571                        private final Iterator<E> it = c.iterator();
2572
2573                        public boolean hasNext() {
2574                            return it.hasNext();
2575                        }
2576
2577                        public E next() {
2578                            return it.next();
2579                        }
2580
2581                        public void remove() {
2582                            it.remove();
2583                        }
2584                    };
2585                }
2586
2587                public boolean add(E e) {
2588                    typeCheck(e);
2589                    return c.add(e);
2590                }
2591
2592                public boolean addAll(Collection<? extends E> coll) {
2593                    /*
2594                     * Dump coll into an array of the required type.  This serves
2595                     * three purposes: it insulates us from concurrent changes in
2596                     * the contents of coll, it type-checks all of the elements in
2597                     * coll, and it provides all-or-nothing semantics (which we
2598                     * wouldn't get if we type-checked each element as we added it).
2599                     */
2600                    E[] a = null;
2601                    try {
2602                        a = coll.toArray(zeroLengthElementArray());
2603                    } catch (ArrayStoreException e) {
2604                        throw new ClassCastException();
2605                    }
2606
2607                    return c.addAll(Arrays.asList(a));
2608                }
2609
2610                private E[] zeroLengthElementArray = null; // Lazily initialized
2611
2612                /*
2613                 * We don't need locking or volatile, because it's OK if we create
2614                 * several zeroLengthElementArrays, and they're immutable.
2615                 */
2616                E[] zeroLengthElementArray() {
2617                    if (zeroLengthElementArray == null)
2618                        zeroLengthElementArray = (E[]) Array.newInstance(type,
2619                                0);
2620                    return zeroLengthElementArray;
2621                }
2622            }
2623
2624            /**
2625             * Returns a dynamically typesafe view of the specified set.
2626             * Any attempt to insert an element of the wrong type will result in
2627             * an immediate <tt>ClassCastException</tt>.  Assuming a set contains
2628             * no incorrectly typed elements prior to the time a dynamically typesafe
2629             * view is generated, and that all subsequent access to the set
2630             * takes place through the view, it is <i>guaranteed</i> that the
2631             * set cannot contain an incorrectly typed element.
2632             *
2633             * <p>A discussion of the use of dynamically typesafe views may be
2634             * found in the documentation for the {@link #checkedCollection checkedCollection}
2635             * method.
2636             *
2637             * <p>The returned set will be serializable if the specified set is
2638             * serializable.
2639             *
2640             * @param s the set for which a dynamically typesafe view is to be
2641             *             returned
2642             * @param type the type of element that <tt>s</tt> is permitted to hold
2643             * @return a dynamically typesafe view of the specified set
2644             * @since 1.5
2645             */
2646            public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
2647                return new CheckedSet<E>(s, type);
2648            }
2649
2650            /**
2651             * @serial include
2652             */
2653            static class CheckedSet<E> extends CheckedCollection<E> implements 
2654                    Set<E>, Serializable {
2655                private static final long serialVersionUID = 4694047833775013803L;
2656
2657                CheckedSet(Set<E> s, Class<E> elementType) {
2658                    super (s, elementType);
2659                }
2660
2661                public boolean equals(Object o) {
2662                    return o == this  || c.equals(o);
2663                }
2664
2665                public int hashCode() {
2666                    return c.hashCode();
2667                }
2668            }
2669
2670            /**
2671             * Returns a dynamically typesafe view of the specified sorted set.  Any
2672             * attempt to insert an element of the wrong type will result in an
2673             * immediate <tt>ClassCastException</tt>.  Assuming a sorted set contains
2674             * no incorrectly typed elements prior to the time a dynamically typesafe
2675             * view is generated, and that all subsequent access to the sorted set
2676             * takes place through the view, it is <i>guaranteed</i> that the sorted
2677             * set cannot contain an incorrectly typed element.
2678             *
2679             * <p>A discussion of the use of dynamically typesafe views may be
2680             * found in the documentation for the {@link #checkedCollection checkedCollection}
2681             * method.
2682             *
2683             * <p>The returned sorted set will be serializable if the specified sorted
2684             * set is serializable.
2685             *
2686             * @param s the sorted set for which a dynamically typesafe view is to be
2687             *             returned
2688             * @param type the type of element that <tt>s</tt> is permitted to hold
2689             * @return a dynamically typesafe view of the specified sorted set
2690             * @since 1.5
2691             */
2692            public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
2693                    Class<E> type) {
2694                return new CheckedSortedSet<E>(s, type);
2695            }
2696
2697            /**
2698             * @serial include
2699             */
2700            static class CheckedSortedSet<E> extends CheckedSet<E> implements 
2701                    SortedSet<E>, Serializable {
2702                private static final long serialVersionUID = 1599911165492914959L;
2703                private final SortedSet<E> ss;
2704
2705                CheckedSortedSet(SortedSet<E> s, Class<E> type) {
2706                    super (s, type);
2707                    ss = s;
2708                }
2709
2710                public Comparator<? super  E> comparator() {
2711                    return ss.comparator();
2712                }
2713
2714                public E first() {
2715                    return ss.first();
2716                }
2717
2718                public E last() {
2719                    return ss.last();
2720                }
2721
2722                public SortedSet<E> subSet(E fromElement, E toElement) {
2723                    return new CheckedSortedSet<E>(ss.subSet(fromElement,
2724                            toElement), type);
2725                }
2726
2727                public SortedSet<E> headSet(E toElement) {
2728                    return new CheckedSortedSet<E>(ss.headSet(toElement), type);
2729                }
2730
2731                public SortedSet<E> tailSet(E fromElement) {
2732                    return new CheckedSortedSet<E>(ss.tailSet(fromElement),
2733                            type);
2734                }
2735            }
2736
2737            /**
2738             * Returns a dynamically typesafe view of the specified list.
2739             * Any attempt to insert an element of the wrong type will result in
2740             * an immediate <tt>ClassCastException</tt>.  Assuming a list contains
2741             * no incorrectly typed elements prior to the time a dynamically typesafe
2742             * view is generated, and that all subsequent access to the list
2743             * takes place through the view, it is <i>guaranteed</i> that the
2744             * list cannot contain an incorrectly typed element.
2745             *
2746             * <p>A discussion of the use of dynamically typesafe views may be
2747             * found in the documentation for the {@link #checkedCollection checkedCollection}
2748             * method.
2749             *
2750             * <p>The returned list will be serializable if the specified list is
2751             * serializable.
2752             *
2753             * @param list the list for which a dynamically typesafe view is to be
2754             *             returned
2755             * @param type the type of element that <tt>list</tt> is permitted to hold
2756             * @return a dynamically typesafe view of the specified list
2757             * @since 1.5
2758             */
2759            public static <E> List<E> checkedList(List<E> list, Class<E> type) {
2760                return (list instanceof  RandomAccess ? new CheckedRandomAccessList<E>(
2761                        list, type)
2762                        : new CheckedList<E>(list, type));
2763            }
2764
2765            /**
2766             * @serial include
2767             */
2768            static class CheckedList<E> extends CheckedCollection<E> implements 
2769                    List<E> {
2770                private static final long serialVersionUID = 65247728283967356L;
2771                final List<E> list;
2772
2773                CheckedList(List<E> list, Class<E> type) {
2774                    super (list, type);
2775                    this .list = list;
2776                }
2777
2778                public boolean equals(Object o) {
2779                    return o == this  || list.equals(o);
2780                }
2781
2782                public int hashCode() {
2783                    return list.hashCode();
2784                }
2785
2786                public E get(int index) {
2787                    return list.get(index);
2788                }
2789
2790                public E remove(int index) {
2791                    return list.remove(index);
2792                }
2793
2794                public int indexOf(Object o) {
2795                    return list.indexOf(o);
2796                }
2797
2798                public int lastIndexOf(Object o) {
2799                    return list.lastIndexOf(o);
2800                }
2801
2802                public E set(int index, E element) {
2803                    typeCheck(element);
2804                    return list.set(index, element);
2805                }
2806
2807                public void add(int index, E element) {
2808                    typeCheck(element);
2809                    list.add(index, element);
2810                }
2811
2812                public boolean addAll(int index, Collection<? extends E> c) {
2813                    // See CheckCollection.addAll, above, for an explanation
2814                    E[] a = null;
2815                    try {
2816                        a = c.toArray(zeroLengthElementArray());
2817                    } catch (ArrayStoreException e) {
2818                        throw new ClassCastException();
2819                    }
2820
2821                    return list.addAll(index, Arrays.asList(a));
2822                }
2823
2824                public ListIterator<E> listIterator() {
2825                    return listIterator(0);
2826                }
2827
2828                public ListIterator<E> listIterator(final int index) {
2829                    return new ListIterator<E>() {
2830                        private final ListIterator<E> i = list
2831                                .listIterator(index);
2832
2833                        public boolean hasNext() {
2834                            return i.hasNext();
2835                        }
2836
2837                        public E next() {
2838                            return i.next();
2839                        }
2840
2841                        public boolean hasPrevious() {
2842                            return i.hasPrevious();
2843                        }
2844
2845                        public E previous() {
2846                            return i.previous();
2847                        }
2848
2849                        public int nextIndex() {
2850                            return i.nextIndex();
2851                        }
2852
2853                        public int previousIndex() {
2854                            return i.previousIndex();
2855                        }
2856
2857                        public void remove() {
2858                            i.remove();
2859                        }
2860
2861                        public void set(E e) {
2862                            typeCheck(e);
2863                            i.set(e);
2864                        }
2865
2866                        public void add(E e) {
2867                            typeCheck(e);
2868                            i.add(e);
2869                        }
2870                    };
2871                }
2872
2873                public List<E> subList(int fromIndex, int toIndex) {
2874                    return new CheckedList<E>(list.subList(fromIndex, toIndex),
2875                            type);
2876                }
2877            }
2878
2879            /**
2880             * @serial include
2881             */
2882            static class CheckedRandomAccessList<E> extends CheckedList<E>
2883                    implements  RandomAccess {
2884                private static final long serialVersionUID = 1638200125423088369L;
2885
2886                CheckedRandomAccessList(List<E> list, Class<E> type) {
2887                    super (list, type);
2888                }
2889
2890                public List<E> subList(int fromIndex, int toIndex) {
2891                    return new CheckedRandomAccessList<E>(list.subList(
2892                            fromIndex, toIndex), type);
2893                }
2894            }
2895
2896            /**
2897             * Returns a dynamically typesafe view of the specified map.  Any attempt
2898             * to insert a mapping whose key or value have the wrong type will result
2899             * in an immediate <tt>ClassCastException</tt>.  Similarly, any attempt to
2900             * modify the value currently associated with a key will result in an
2901             * immediate <tt>ClassCastException</tt>, whether the modification is
2902             * attempted directly through the map itself, or through a {@link
2903             * Map.Entry} instance obtained from the map's {@link Map#entrySet()
2904             * entry set} view.
2905             *
2906             * <p>Assuming a map contains no incorrectly typed keys or values
2907             * prior to the time a dynamically typesafe view is generated, and
2908             * that all subsequent access to the map takes place through the view
2909             * (or one of its collection views), it is <i>guaranteed</i> that the
2910             * map cannot contain an incorrectly typed key or value.
2911             *
2912             * <p>A discussion of the use of dynamically typesafe views may be
2913             * found in the documentation for the {@link #checkedCollection checkedCollection}
2914             * method.
2915             *
2916             * <p>The returned map will be serializable if the specified map is
2917             * serializable.
2918             *
2919             * @param m the map for which a dynamically typesafe view is to be
2920             *             returned
2921             * @param keyType the type of key that <tt>m</tt> is permitted to hold
2922             * @param valueType the type of value that <tt>m</tt> is permitted to hold
2923             * @return a dynamically typesafe view of the specified map
2924             * @since 1.5
2925             */
2926            public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
2927                    Class<K> keyType, Class<V> valueType) {
2928                return new CheckedMap<K, V>(m, keyType, valueType);
2929            }
2930
2931            /**
2932             * @serial include
2933             */
2934            private static class CheckedMap<K, V> implements  Map<K, V>,
2935                    Serializable {
2936                private static final long serialVersionUID = 5742860141034234728L;
2937
2938                private final Map<K, V> m;
2939                final Class<K> keyType;
2940                final Class<V> valueType;
2941
2942                private void typeCheck(Object key, Object value) {
2943                    if (!keyType.isInstance(key))
2944                        throw new ClassCastException("Attempt to insert "
2945                                + key.getClass()
2946                                + " key into collection with key type "
2947                                + keyType);
2948
2949                    if (!valueType.isInstance(value))
2950                        throw new ClassCastException("Attempt to insert "
2951                                + value.getClass()
2952                                + " value into collection with value type "
2953                                + valueType);
2954                }
2955
2956                CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) {
2957                    if (m == null || keyType == null || valueType == null)
2958                        throw new NullPointerException();
2959                    this .m = m;
2960                    this .keyType = keyType;
2961                    this .valueType = valueType;
2962                }
2963
2964                public int size() {
2965                    return m.size();
2966                }
2967
2968                public boolean isEmpty() {
2969                    return m.isEmpty();
2970                }
2971
2972                public boolean containsKey(Object key) {
2973                    return m.containsKey(key);
2974                }
2975
2976                public boolean containsValue(Object v) {
2977                    return m.containsValue(v);
2978                }
2979
2980                public V get(Object key) {
2981                    return m.get(key);
2982                }
2983
2984                public V remove(Object key) {
2985                    return m.remove(key);
2986                }
2987
2988                public void clear() {
2989                    m.clear();
2990                }
2991
2992                public Set<K> keySet() {
2993                    return m.keySet();
2994                }
2995
2996                public Collection<V> values() {
2997                    return m.values();
2998                }
2999
3000                public boolean equals(Object o) {
3001                    return o == this  || m.equals(o);
3002                }
3003
3004                public int hashCode() {
3005                    return m.hashCode();
3006                }
3007
3008                public String toString() {
3009                    return m.toString();
3010                }
3011
3012                public V put(K key, V value) {
3013                    typeCheck(key, value);
3014                    return m.put(key, value);
3015                }
3016
3017                public void putAll(Map<? extends K, ? extends V> t) {
3018                    // See CheckCollection.addAll, above, for an explanation
3019                    K[] keys = null;
3020                    try {
3021                        keys = t.keySet().toArray(zeroLengthKeyArray());
3022                    } catch (ArrayStoreException e) {
3023                        throw new ClassCastException();
3024                    }
3025                    V[] values = null;
3026                    try {
3027                        values = t.values().toArray(zeroLengthValueArray());
3028                    } catch (ArrayStoreException e) {
3029                        throw new ClassCastException();
3030                    }
3031
3032                    if (keys.length != values.length)
3033                        throw new ConcurrentModificationException();
3034
3035                    for (int i = 0; i < keys.length; i++)
3036                        m.put(keys[i], values[i]);
3037                }
3038
3039                // Lazily initialized
3040                private K[] zeroLengthKeyArray = null;
3041                private V[] zeroLengthValueArray = null;
3042
3043                /*
3044                 * We don't need locking or volatile, because it's OK if we create
3045                 * several zeroLengthValueArrays, and they're immutable.
3046                 */
3047                private K[] zeroLengthKeyArray() {
3048                    if (zeroLengthKeyArray == null)
3049                        zeroLengthKeyArray = (K[]) Array
3050                                .newInstance(keyType, 0);
3051                    return zeroLengthKeyArray;
3052                }
3053
3054                private V[] zeroLengthValueArray() {
3055                    if (zeroLengthValueArray == null)
3056                        zeroLengthValueArray = (V[]) Array.newInstance(
3057                                valueType, 0);
3058                    return zeroLengthValueArray;
3059                }
3060
3061                private transient Set<Map.Entry<K, V>> entrySet = null;
3062
3063                public Set<Map.Entry<K, V>> entrySet() {
3064                    if (entrySet == null)
3065                        entrySet = new CheckedEntrySet<K, V>(m.entrySet(),
3066                                valueType);
3067                    return entrySet;
3068                }
3069
3070                /**
3071                 * We need this class in addition to CheckedSet as Map.Entry permits
3072                 * modification of the backing Map via the setValue operation.  This
3073                 * class is subtle: there are many possible attacks that must be
3074                 * thwarted.
3075                 *
3076                 * @serial exclude
3077                 */
3078                static class CheckedEntrySet<K, V> implements 
3079                        Set<Map.Entry<K, V>> {
3080                    Set<Map.Entry<K, V>> s;
3081                    Class<V> valueType;
3082
3083                    CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) {
3084                        this .s = s;
3085                        this .valueType = valueType;
3086                    }
3087
3088                    public int size() {
3089                        return s.size();
3090                    }
3091
3092                    public boolean isEmpty() {
3093                        return s.isEmpty();
3094                    }
3095
3096                    public String toString() {
3097                        return s.toString();
3098                    }
3099
3100                    public int hashCode() {
3101                        return s.hashCode();
3102                    }
3103
3104                    public boolean remove(Object o) {
3105                        return s.remove(o);
3106                    }
3107
3108                    public boolean removeAll(Collection<?> coll) {
3109                        return s.removeAll(coll);
3110                    }
3111
3112                    public boolean retainAll(Collection<?> coll) {
3113                        return s.retainAll(coll);
3114                    }
3115
3116                    public void clear() {
3117                        s.clear();
3118                    }
3119
3120                    public boolean add(Map.Entry<K, V> e) {
3121                        throw new UnsupportedOperationException();
3122                    }
3123
3124                    public boolean addAll(
3125                            Collection<? extends Map.Entry<K, V>> coll) {
3126                        throw new UnsupportedOperationException();
3127                    }
3128
3129                    public Iterator<Map.Entry<K, V>> iterator() {
3130                        return new Iterator<Map.Entry<K, V>>() {
3131                            private final Iterator<Map.Entry<K, V>> i = s
3132                                    .iterator();
3133
3134                            public boolean hasNext() {
3135                                return i.hasNext();
3136                            }
3137
3138                            public void remove() {
3139                                i.remove();
3140                            }
3141
3142                            public Map.Entry<K, V> next() {
3143                                return new CheckedEntry<K, V>(i.next(),
3144                                        valueType);
3145                            }
3146                        };
3147                    }
3148
3149                    public Object[] toArray() {
3150                        Object[] source = s.toArray();
3151
3152                        /*
3153                         * Ensure that we don't get an ArrayStoreException even if
3154                         * s.toArray returns an array of something other than Object
3155                         */
3156                        Object[] dest = (CheckedEntry.class.isInstance(source
3157                                .getClass().getComponentType()) ? source
3158                                : new Object[source.length]);
3159
3160                        for (int i = 0; i < source.length; i++)
3161                            dest[i] = new CheckedEntry<K, V>(
3162                                    (Map.Entry<K, V>) source[i], valueType);
3163                        return dest;
3164                    }
3165
3166                    public <T> T[] toArray(T[] a) {
3167                        // We don't pass a to s.toArray, to avoid window of
3168                        // vulnerability wherein an unscrupulous multithreaded client
3169                        // could get his hands on raw (unwrapped) Entries from s.
3170                        Object[] arr = s.toArray(a.length == 0 ? a : Arrays
3171                                .copyOf(a, 0));
3172
3173                        for (int i = 0; i < arr.length; i++)
3174                            arr[i] = new CheckedEntry<K, V>(
3175                                    (Map.Entry<K, V>) arr[i], valueType);
3176                        if (arr.length > a.length)
3177                            return (T[]) arr;
3178
3179                        System.arraycopy(arr, 0, a, 0, arr.length);
3180                        if (a.length > arr.length)
3181                            a[arr.length] = null;
3182                        return a;
3183                    }
3184
3185                    /**
3186                     * This method is overridden to protect the backing set against
3187                     * an object with a nefarious equals function that senses
3188                     * that the equality-candidate is Map.Entry and calls its
3189                     * setValue method.
3190                     */
3191                    public boolean contains(Object o) {
3192                        if (!(o instanceof  Map.Entry))
3193                            return false;
3194                        return s.contains(new CheckedEntry<K, V>(
3195                                (Map.Entry<K, V>) o, valueType));
3196                    }
3197
3198                    /**
3199                     * The next two methods are overridden to protect against
3200                     * an unscrupulous collection whose contains(Object o) method
3201                     * senses when o is a Map.Entry, and calls o.setValue.
3202                     */
3203                    public boolean containsAll(Collection<?> coll) {
3204                        Iterator<?> e = coll.iterator();
3205                        while (e.hasNext())
3206                            if (!contains(e.next())) // Invokes safe contains() above
3207                                return false;
3208                        return true;
3209                    }
3210
3211                    public boolean equals(Object o) {
3212                        if (o == this )
3213                            return true;
3214                        if (!(o instanceof  Set))
3215                            return false;
3216                        Set<?> that = (Set<?>) o;
3217                        if (that.size() != s.size())
3218                            return false;
3219                        return containsAll(that); // Invokes safe containsAll() above
3220                    }
3221
3222                    /**
3223                     * This "wrapper class" serves two purposes: it prevents
3224                     * the client from modifying the backing Map, by short-circuiting
3225                     * the setValue method, and it protects the backing Map against
3226                     * an ill-behaved Map.Entry that attempts to modify another
3227                     * Map Entry when asked to perform an equality check.
3228                     */
3229                    private static class CheckedEntry<K, V> implements 
3230                            Map.Entry<K, V> {
3231                        private Map.Entry<K, V> e;
3232                        private Class<V> valueType;
3233
3234                        CheckedEntry(Map.Entry<K, V> e, Class<V> valueType) {
3235                            this .e = e;
3236                            this .valueType = valueType;
3237                        }
3238
3239                        public K getKey() {
3240                            return e.getKey();
3241                        }
3242
3243                        public V getValue() {
3244                            return e.getValue();
3245                        }
3246
3247                        public int hashCode() {
3248                            return e.hashCode();
3249                        }
3250
3251                        public String toString() {
3252                            return e.toString();
3253                        }
3254
3255                        public V setValue(V value) {
3256                            if (!valueType.isInstance(value))
3257                                throw new ClassCastException(
3258                                        "Attempt to insert "
3259                                                + value.getClass()
3260                                                + " value into collection with value type "
3261                                                + valueType);
3262                            return e.setValue(value);
3263                        }
3264
3265                        public boolean equals(Object o) {
3266                            if (!(o instanceof  Map.Entry))
3267                                return false;
3268                            Map.Entry t = (Map.Entry) o;
3269                            return eq(e.getKey(), t.getKey())
3270                                    && eq(e.getValue(), t.getValue());
3271                        }
3272                    }
3273                }
3274            }
3275
3276            /**
3277             * Returns a dynamically typesafe view of the specified sorted map.  Any
3278             * attempt to insert a mapping whose key or value have the wrong type will
3279             * result in an immediate <tt>ClassCastException</tt>.  Similarly, any
3280             * attempt to modify the value currently associated with a key will result
3281             * in an immediate <tt>ClassCastException</tt>, whether the modification
3282             * is attempted directly through the map itself, or through a {@link
3283             * Map.Entry} instance obtained from the map's {@link Map#entrySet() entry
3284             * set} view.
3285             *
3286             * <p>Assuming a map contains no incorrectly typed keys or values
3287             * prior to the time a dynamically typesafe view is generated, and
3288             * that all subsequent access to the map takes place through the view
3289             * (or one of its collection views), it is <i>guaranteed</i> that the
3290             * map cannot contain an incorrectly typed key or value.
3291             *
3292             * <p>A discussion of the use of dynamically typesafe views may be
3293             * found in the documentation for the {@link #checkedCollection checkedCollection}
3294             * method.
3295             *
3296             * <p>The returned map will be serializable if the specified map is
3297             * serializable.
3298             *
3299             * @param m the map for which a dynamically typesafe view is to be
3300             *             returned
3301             * @param keyType the type of key that <tt>m</tt> is permitted to hold
3302             * @param valueType the type of value that <tt>m</tt> is permitted to hold
3303             * @return a dynamically typesafe view of the specified map
3304             * @since 1.5
3305             */
3306            public static <K, V> SortedMap<K, V> checkedSortedMap(
3307                    SortedMap<K, V> m, Class<K> keyType, Class<V> valueType) {
3308                return new CheckedSortedMap<K, V>(m, keyType, valueType);
3309            }
3310
3311            /**
3312             * @serial include
3313             */
3314            static class CheckedSortedMap<K, V> extends CheckedMap<K, V>
3315                    implements  SortedMap<K, V>, Serializable {
3316                private static final long serialVersionUID = 1599671320688067438L;
3317
3318                private final SortedMap<K, V> sm;
3319
3320                CheckedSortedMap(SortedMap<K, V> m, Class<K> keyType,
3321                        Class<V> valueType) {
3322                    super (m, keyType, valueType);
3323                    sm = m;
3324                }
3325
3326                public Comparator<? super  K> comparator() {
3327                    return sm.comparator();
3328                }
3329
3330                public K firstKey() {
3331                    return sm.firstKey();
3332                }
3333
3334                public K lastKey() {
3335                    return sm.lastKey();
3336                }
3337
3338                public SortedMap<K, V> subMap(K fromKey, K toKey) {
3339                    return new CheckedSortedMap<K, V>(
3340                            sm.subMap(fromKey, toKey), keyType, valueType);
3341                }
3342
3343                public SortedMap<K, V> headMap(K toKey) {
3344                    return new CheckedSortedMap<K, V>(sm.headMap(toKey),
3345                            keyType, valueType);
3346                }
3347
3348                public SortedMap<K, V> tailMap(K fromKey) {
3349                    return new CheckedSortedMap<K, V>(sm.tailMap(fromKey),
3350                            keyType, valueType);
3351                }
3352            }
3353
3354            // Empty collections
3355
3356            /**
3357             * Returns an iterator that has no elements.  More precisely,
3358             *
3359             * <ul compact>
3360             *
3361             * <li>{@link Iterator#hasNext hasNext} always returns {@code
3362             * false}.
3363             *
3364             * <li>{@link Iterator#next next} always throws {@link
3365             * NoSuchElementException}.
3366             *
3367             * <li>{@link Iterator#remove remove} always throws {@link
3368             * IllegalStateException}.
3369             *
3370             * </ul>
3371             *
3372             * <p>Implementations of this method are permitted, but not
3373             * required, to return the same object from multiple invocations.
3374             *
3375             * @return an empty iterator
3376             * @since 1.7
3377             */
3378            @SuppressWarnings("unchecked")
3379            public static <T> Iterator<T> emptyIterator() {
3380                return (Iterator<T>) EmptyIterator.EMPTY_ITERATOR;
3381            }
3382
3383            private static class EmptyIterator<E> implements  Iterator<E> {
3384                static final EmptyIterator<Object> EMPTY_ITERATOR = new EmptyIterator<Object>();
3385
3386                public boolean hasNext() {
3387                    return false;
3388                }
3389
3390                public E next() {
3391                    throw new NoSuchElementException();
3392                }
3393
3394                public void remove() {
3395                    throw new IllegalStateException();
3396                }
3397            }
3398
3399            /**
3400             * Returns a list iterator that has no elements.  More precisely,
3401             *
3402             * <ul compact>
3403             *
3404             * <li>{@link Iterator#hasNext hasNext} and {@link
3405             * ListIterator#hasPrevious hasPrevious} always return {@code
3406             * false}.
3407             *
3408             * <li>{@link Iterator#next next} and {@link ListIterator#previous
3409             * previous} always throw {@link NoSuchElementException}.
3410             *
3411             * <li>{@link Iterator#remove remove} and {@link ListIterator#set
3412             * set} always throw {@link IllegalStateException}.
3413             *
3414             * <li>{@link ListIterator#add add} always throws {@link
3415             * UnsupportedOperationException}.
3416             *
3417             * <li>{@link ListIterator#nextIndex nextIndex} always returns
3418             * {@code 0} .
3419             *
3420             * <li>{@link ListIterator#previousIndex previousIndex} always
3421             * returns {@code -1}.
3422             *
3423             * </ul>
3424             *
3425             * <p>Implementations of this method are permitted, but not
3426             * required, to return the same object from multiple invocations.
3427             *
3428             * @return an empty list iterator
3429             * @since 1.7
3430             */
3431            @SuppressWarnings("unchecked")
3432            public static <T> ListIterator<T> emptyListIterator() {
3433                return (ListIterator<T>) EmptyListIterator.EMPTY_ITERATOR;
3434            }
3435
3436            private static class EmptyListIterator<E> extends EmptyIterator<E>
3437                    implements  ListIterator<E> {
3438                static final EmptyListIterator<Object> EMPTY_ITERATOR = new EmptyListIterator<Object>();
3439
3440                public boolean hasPrevious() {
3441                    return false;
3442                }
3443
3444                public E previous() {
3445                    throw new NoSuchElementException();
3446                }
3447
3448                public int nextIndex() {
3449                    return 0;
3450                }
3451
3452                public int previousIndex() {
3453                    return -1;
3454                }
3455
3456                public void set(E e) {
3457                    throw new IllegalStateException();
3458                }
3459
3460                public void add(E e) {
3461                    throw new UnsupportedOperationException();
3462                }
3463            }
3464
3465            /**
3466             * Returns an enumeration that has no elements.  More precisely,
3467             *
3468             * <ul compact>
3469             *
3470             * <li>{@link Enumeration#hasMoreElements hasMoreElements} always
3471             * returns {@code false}.
3472             *
3473             * <li> {@link Enumeration#nextElement nextElement} always throws
3474             * {@link NoSuchElementException}.
3475             *
3476             * </ul>
3477             *
3478             * <p>Implementations of this method are permitted, but not
3479             * required, to return the same object from multiple invocations.
3480             *
3481             * @return an empty enumeration
3482             * @since 1.7
3483             */
3484            @SuppressWarnings("unchecked")
3485            public static <T> Enumeration<T> emptyEnumeration() {
3486                return (Enumeration<T>) EmptyEnumeration.EMPTY_ENUMERATION;
3487            }
3488
3489            private static class EmptyEnumeration<E> implements  Enumeration<E> {
3490                static final EmptyEnumeration<Object> EMPTY_ENUMERATION = new EmptyEnumeration<Object>();
3491
3492                public boolean hasMoreElements() {
3493                    return false;
3494                }
3495
3496                public E nextElement() {
3497                    throw new NoSuchElementException();
3498                }
3499            }
3500
3501            /**
3502             * The empty set (immutable).  This set is serializable.
3503             *
3504             * @see #emptySet()
3505             */
3506            @SuppressWarnings("unchecked")
3507            public static final Set EMPTY_SET = new EmptySet<Object>();
3508
3509            /**
3510             * Returns the empty set (immutable).  This set is serializable.
3511             * Unlike the like-named field, this method is parameterized.
3512             *
3513             * <p>This example illustrates the type-safe way to obtain an empty set:
3514             * <pre>
3515             *     Set&lt;String&gt; s = Collections.emptySet();
3516             * </pre>
3517             * Implementation note:  Implementations of this method need not
3518             * create a separate <tt>Set</tt> object for each call.   Using this
3519             * method is likely to have comparable cost to using the like-named
3520             * field.  (Unlike this method, the field does not provide type safety.)
3521             *
3522             * @see #EMPTY_SET
3523             * @since 1.5
3524             */
3525            @SuppressWarnings("unchecked")
3526            public static final <T> Set<T> emptySet() {
3527                return (Set<T>) EMPTY_SET;
3528            }
3529
3530            /**
3531             * @serial include
3532             */
3533            private static class EmptySet<E> extends AbstractSet<E> implements 
3534                    Serializable {
3535                private static final long serialVersionUID = 1582296315990362920L;
3536
3537                public Iterator<E> iterator() {
3538                    return emptyIterator();
3539                }
3540
3541                public int size() {
3542                    return 0;
3543                }
3544
3545                public boolean isEmpty() {
3546                    return true;
3547                }
3548
3549                public boolean contains(Object obj) {
3550                    return false;
3551                }
3552
3553                public boolean containsAll(Collection<?> c) {
3554                    return c.isEmpty();
3555                }
3556
3557                public Object[] toArray() {
3558                    return new Object[0];
3559                }
3560
3561                public <T> T[] toArray(T[] a) {
3562                    if (a.length > 0)
3563                        a[0] = null;
3564                    return a;
3565                }
3566
3567                // Preserves singleton property
3568                private Object readResolve() {
3569                    return EMPTY_SET;
3570                }
3571            }
3572
3573            /**
3574             * The empty list (immutable).  This list is serializable.
3575             *
3576             * @see #emptyList()
3577             */
3578            @SuppressWarnings("unchecked")
3579            public static final List EMPTY_LIST = new EmptyList<Object>();
3580
3581            /**
3582             * Returns the empty list (immutable).  This list is serializable.
3583             *
3584             * <p>This example illustrates the type-safe way to obtain an empty list:
3585             * <pre>
3586             *     List&lt;String&gt; s = Collections.emptyList();
3587             * </pre>
3588             * Implementation note:  Implementations of this method need not
3589             * create a separate <tt>List</tt> object for each call.   Using this
3590             * method is likely to have comparable cost to using the like-named
3591             * field.  (Unlike this method, the field does not provide type safety.)
3592             *
3593             * @see #EMPTY_LIST
3594             * @since 1.5
3595             */
3596            @SuppressWarnings("unchecked")
3597            public static final <T> List<T> emptyList() {
3598                return (List<T>) EMPTY_LIST;
3599            }
3600
3601            /**
3602             * @serial include
3603             */
3604            private static class EmptyList<E> extends AbstractList<E> implements 
3605                    RandomAccess, Serializable {
3606                private static final long serialVersionUID = 8842843931221139166L;
3607
3608                public Iterator<E> iterator() {
3609                    return emptyIterator();
3610                }
3611
3612                public ListIterator<E> listIterator() {
3613                    return emptyListIterator();
3614                }
3615
3616                public int size() {
3617                    return 0;
3618                }
3619
3620                public boolean isEmpty() {
3621                    return true;
3622                }
3623
3624                public boolean contains(Object obj) {
3625                    return false;
3626                }
3627
3628                public boolean containsAll(Collection<?> c) {
3629                    return c.isEmpty();
3630                }
3631
3632                public Object[] toArray() {
3633                    return new Object[0];
3634                }
3635
3636                public <T> T[] toArray(T[] a) {
3637                    if (a.length > 0)
3638                        a[0] = null;
3639                    return a;
3640                }
3641
3642                public E get(int index) {
3643                    throw new IndexOutOfBoundsException("Index: " + index);
3644                }
3645
3646                public boolean equals(Object o) {
3647                    return (o instanceof  List) && ((List<?>) o).isEmpty();
3648                }
3649
3650                public int hashCode() {
3651                    return 1;
3652                }
3653
3654                // Preserves singleton property
3655                private Object readResolve() {
3656                    return EMPTY_LIST;
3657                }
3658            }
3659
3660            /**
3661             * The empty map (immutable).  This map is serializable.
3662             *
3663             * @see #emptyMap()
3664             * @since 1.3
3665             */
3666            @SuppressWarnings("unchecked")
3667            public static final Map EMPTY_MAP = new EmptyMap<Object, Object>();
3668
3669            /**
3670             * Returns the empty map (immutable).  This map is serializable.
3671             *
3672             * <p>This example illustrates the type-safe way to obtain an empty set:
3673             * <pre>
3674             *     Map&lt;String, Date&gt; s = Collections.emptyMap();
3675             * </pre>
3676             * Implementation note:  Implementations of this method need not
3677             * create a separate <tt>Map</tt> object for each call.   Using this
3678             * method is likely to have comparable cost to using the like-named
3679             * field.  (Unlike this method, the field does not provide type safety.)
3680             *
3681             * @see #EMPTY_MAP
3682             * @since 1.5
3683             */
3684            @SuppressWarnings("unchecked")
3685            public static final <K, V> Map<K, V> emptyMap() {
3686                return (Map<K, V>) EMPTY_MAP;
3687            }
3688
3689            /**
3690             * @serial include
3691             */
3692            private static class EmptyMap<K, V> extends AbstractMap<K, V>
3693                    implements  Serializable {
3694                private static final long serialVersionUID = 6428348081105594320L;
3695
3696                public int size() {
3697                    return 0;
3698                }
3699
3700                public boolean isEmpty() {
3701                    return true;
3702                }
3703
3704                public boolean containsKey(Object key) {
3705                    return false;
3706                }
3707
3708                public boolean containsValue(Object value) {
3709                    return false;
3710                }
3711
3712                public V get(Object key) {
3713                    return null;
3714                }
3715
3716                public Set<K> keySet() {
3717                    return emptySet();
3718                }
3719
3720                public Collection<V> values() {
3721                    return emptySet();
3722                }
3723
3724                public Set<Map.Entry<K, V>> entrySet() {
3725                    return emptySet();
3726                }
3727
3728                public boolean equals(Object o) {
3729                    return (o instanceof  Map) && ((Map<?, ?>) o).isEmpty();
3730                }
3731
3732                public int hashCode() {
3733                    return 0;
3734                }
3735
3736                // Preserves singleton property
3737                private Object readResolve() {
3738                    return EMPTY_MAP;
3739                }
3740            }
3741
3742            // Singleton collections
3743
3744            /**
3745             * Returns an immutable set containing only the specified object.
3746             * The returned set is serializable.
3747             *
3748             * @param o the sole object to be stored in the returned set.
3749             * @return an immutable set containing only the specified object.
3750             */
3751            public static <T> Set<T> singleton(T o) {
3752                return new SingletonSet<T>(o);
3753            }
3754
3755            static <E> Iterator<E> singletonIterator(final E e) {
3756                return new Iterator<E>() {
3757                    private boolean hasNext = true;
3758
3759                    public boolean hasNext() {
3760                        return hasNext;
3761                    }
3762
3763                    public E next() {
3764                        if (hasNext) {
3765                            hasNext = false;
3766                            return e;
3767                        }
3768                        throw new NoSuchElementException();
3769                    }
3770
3771                    public void remove() {
3772                        throw new UnsupportedOperationException();
3773                    }
3774                };
3775            }
3776
3777            /**
3778             * @serial include
3779             */
3780            private static class SingletonSet<E> extends AbstractSet<E>
3781                    implements  Serializable {
3782                private static final long serialVersionUID = 3193687207550431679L;
3783
3784                final private E element;
3785
3786                SingletonSet(E e) {
3787                    element = e;
3788                }
3789
3790                public Iterator<E> iterator() {
3791                    return singletonIterator(element);
3792                }
3793
3794                public int size() {
3795                    return 1;
3796                }
3797
3798                public boolean contains(Object o) {
3799                    return eq(o, element);
3800                }
3801            }
3802
3803            /**
3804             * Returns an immutable list containing only the specified object.
3805             * The returned list is serializable.
3806             *
3807             * @param o the sole object to be stored in the returned list.
3808             * @return an immutable list containing only the specified object.
3809             * @since 1.3
3810             */
3811            public static <T> List<T> singletonList(T o) {
3812                return new SingletonList<T>(o);
3813            }
3814
3815            /**
3816             * @serial include
3817             */
3818            private static class SingletonList<E> extends AbstractList<E>
3819                    implements  RandomAccess, Serializable {
3820
3821                private static final long serialVersionUID = 3093736618740652951L;
3822
3823                private final E element;
3824
3825                SingletonList(E obj) {
3826                    element = obj;
3827                }
3828
3829                public Iterator<E> iterator() {
3830                    return singletonIterator(element);
3831                }
3832
3833                public int size() {
3834                    return 1;
3835                }
3836
3837                public boolean contains(Object obj) {
3838                    return eq(obj, element);
3839                }
3840
3841                public E get(int index) {
3842                    if (index != 0)
3843                        throw new IndexOutOfBoundsException("Index: " + index
3844                                + ", Size: 1");
3845                    return element;
3846                }
3847            }
3848
3849            /**
3850             * Returns an immutable map, mapping only the specified key to the
3851             * specified value.  The returned map is serializable.
3852             *
3853             * @param key the sole key to be stored in the returned map.
3854             * @param value the value to which the returned map maps <tt>key</tt>.
3855             * @return an immutable map containing only the specified key-value
3856             *         mapping.
3857             * @since 1.3
3858             */
3859            public static <K, V> Map<K, V> singletonMap(K key, V value) {
3860                return new SingletonMap<K, V>(key, value);
3861            }
3862
3863            /**
3864             * @serial include
3865             */
3866            private static class SingletonMap<K, V> extends AbstractMap<K, V>
3867                    implements  Serializable {
3868                private static final long serialVersionUID = -6979724477215052911L;
3869
3870                private final K k;
3871                private final V v;
3872
3873                SingletonMap(K key, V value) {
3874                    k = key;
3875                    v = value;
3876                }
3877
3878                public int size() {
3879                    return 1;
3880                }
3881
3882                public boolean isEmpty() {
3883                    return false;
3884                }
3885
3886                public boolean containsKey(Object key) {
3887                    return eq(key, k);
3888                }
3889
3890                public boolean containsValue(Object value) {
3891                    return eq(value, v);
3892                }
3893
3894                public V get(Object key) {
3895                    return (eq(key, k) ? v : null);
3896                }
3897
3898                private transient Set<K> keySet = null;
3899                private transient Set<Map.Entry<K, V>> entrySet = null;
3900                private transient Collection<V> values = null;
3901
3902                public Set<K> keySet() {
3903                    if (keySet == null)
3904                        keySet = singleton(k);
3905                    return keySet;
3906                }
3907
3908                public Set<Map.Entry<K, V>> entrySet() {
3909                    if (entrySet == null)
3910                        entrySet = Collections
3911                                .<Map.Entry<K, V>> singleton(new SimpleImmutableEntry<K, V>(
3912                                        k, v));
3913                    return entrySet;
3914                }
3915
3916                public Collection<V> values() {
3917                    if (values == null)
3918                        values = singleton(v);
3919                    return values;
3920                }
3921
3922            }
3923
3924            // Miscellaneous
3925
3926            /**
3927             * Returns an immutable list consisting of <tt>n</tt> copies of the
3928             * specified object.  The newly allocated data object is tiny (it contains
3929             * a single reference to the data object).  This method is useful in
3930             * combination with the <tt>List.addAll</tt> method to grow lists.
3931             * The returned list is serializable.
3932             *
3933             * @param  n the number of elements in the returned list.
3934             * @param  o the element to appear repeatedly in the returned list.
3935             * @return an immutable list consisting of <tt>n</tt> copies of the
3936             * 	       specified object.
3937             * @throws IllegalArgumentException if n &lt; 0.
3938             * @see    List#addAll(Collection)
3939             * @see    List#addAll(int, Collection)
3940             */
3941            public static <T> List<T> nCopies(int n, T o) {
3942                if (n < 0)
3943                    throw new IllegalArgumentException("List length = " + n);
3944                return new CopiesList<T>(n, o);
3945            }
3946
3947            /**
3948             * @serial include
3949             */
3950            private static class CopiesList<E> extends AbstractList<E>
3951                    implements  RandomAccess, Serializable {
3952                private static final long serialVersionUID = 2739099268398711800L;
3953
3954                final int n;
3955                final E element;
3956
3957                CopiesList(int n, E e) {
3958                    assert n >= 0;
3959                    this .n = n;
3960                    element = e;
3961                }
3962
3963                public int size() {
3964                    return n;
3965                }
3966
3967                public boolean contains(Object obj) {
3968                    return n != 0 && eq(obj, element);
3969                }
3970
3971                public int indexOf(Object o) {
3972                    return contains(o) ? 0 : -1;
3973                }
3974
3975                public int lastIndexOf(Object o) {
3976                    return contains(o) ? n - 1 : -1;
3977                }
3978
3979                public E get(int index) {
3980                    if (index < 0 || index >= n)
3981                        throw new IndexOutOfBoundsException("Index: " + index
3982                                + ", Size: " + n);
3983                    return element;
3984                }
3985
3986                public Object[] toArray() {
3987                    final Object[] a = new Object[n];
3988                    if (element != null)
3989                        Arrays.fill(a, 0, n, element);
3990                    return a;
3991                }
3992
3993                public <T> T[] toArray(T[] a) {
3994                    final int n = this .n;
3995                    if (a.length < n) {
3996                        a = (T[]) java.lang.reflect.Array.newInstance(a
3997                                .getClass().getComponentType(), n);
3998                        if (element != null)
3999                            Arrays.fill(a, 0, n, element);
4000                    } else {
4001                        Arrays.fill(a, 0, n, element);
4002                        if (a.length > n)
4003                            a[n] = null;
4004                    }
4005                    return a;
4006                }
4007
4008                public List<E> subList(int fromIndex, int toIndex) {
4009                    if (fromIndex < 0)
4010                        throw new IndexOutOfBoundsException("fromIndex = "
4011                                + fromIndex);
4012                    if (toIndex > n)
4013                        throw new IndexOutOfBoundsException("toIndex = "
4014                                + toIndex);
4015                    if (fromIndex > toIndex)
4016                        throw new IllegalArgumentException("fromIndex("
4017                                + fromIndex + ") > toIndex(" + toIndex + ")");
4018                    return new CopiesList<E>(toIndex - fromIndex, element);
4019                }
4020            }
4021
4022            /**
4023             * Returns a comparator that imposes the reverse of the <i>natural
4024             * ordering</i> on a collection of objects that implement the
4025             * <tt>Comparable</tt> interface.  (The natural ordering is the ordering
4026             * imposed by the objects' own <tt>compareTo</tt> method.)  This enables a
4027             * simple idiom for sorting (or maintaining) collections (or arrays) of
4028             * objects that implement the <tt>Comparable</tt> interface in
4029             * reverse-natural-order.  For example, suppose a is an array of
4030             * strings. Then: <pre>
4031             * 		Arrays.sort(a, Collections.reverseOrder());
4032             * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
4033             *
4034             * The returned comparator is serializable.
4035             *
4036             * @return a comparator that imposes the reverse of the <i>natural
4037             * 	       ordering</i> on a collection of objects that implement
4038             *	       the <tt>Comparable</tt> interface.
4039             * @see Comparable
4040             */
4041            public static <T> Comparator<T> reverseOrder() {
4042                return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
4043            }
4044
4045            /**
4046             * @serial include
4047             */
4048            private static class ReverseComparator implements 
4049                    Comparator<Comparable<Object>>, Serializable {
4050
4051                private static final long serialVersionUID = 7207038068494060240L;
4052
4053                private static final ReverseComparator REVERSE_ORDER = new ReverseComparator();
4054
4055                public int compare(Comparable<Object> c1, Comparable<Object> c2) {
4056                    return c2.compareTo(c1);
4057                }
4058
4059                private Object readResolve() {
4060                    return reverseOrder();
4061                }
4062            }
4063
4064            /**
4065             * Returns a comparator that imposes the reverse ordering of the specified
4066             * comparator.  If the specified comparator is null, this method is
4067             * equivalent to {@link #reverseOrder()} (in other words, it returns a
4068             * comparator that imposes the reverse of the <i>natural ordering</i> on a
4069             * collection of objects that implement the Comparable interface).
4070             *
4071             * <p>The returned comparator is serializable (assuming the specified
4072             * comparator is also serializable or null).
4073             *
4074             * @return a comparator that imposes the reverse ordering of the
4075             *         specified comparator
4076             * @since 1.5
4077             */
4078            public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
4079                if (cmp == null)
4080                    return reverseOrder();
4081
4082                if (cmp instanceof  ReverseComparator2)
4083                    return ((ReverseComparator2<T>) cmp).cmp;
4084
4085                return new ReverseComparator2<T>(cmp);
4086            }
4087
4088            /**
4089             * @serial include
4090             */
4091            private static class ReverseComparator2<T> implements 
4092                    Comparator<T>, Serializable {
4093                private static final long serialVersionUID = 4374092139857L;
4094
4095                /**
4096                 * The comparator specified in the static factory.  This will never
4097                 * be null, as the static factory returns a ReverseComparator
4098                 * instance if its argument is null.
4099                 *
4100                 * @serial
4101                 */
4102                private final Comparator<T> cmp;
4103
4104                ReverseComparator2(Comparator<T> cmp) {
4105                    assert cmp != null;
4106                    this .cmp = cmp;
4107                }
4108
4109                public int compare(T t1, T t2) {
4110                    return cmp.compare(t2, t1);
4111                }
4112
4113                public boolean equals(Object o) {
4114                    return (o == this )
4115                            || (o instanceof  ReverseComparator2 && cmp
4116                                    .equals(((ReverseComparator2) o).cmp));
4117                }
4118
4119                public int hashCode() {
4120                    return cmp.hashCode() ^ Integer.MIN_VALUE;
4121                }
4122            }
4123
4124            /**
4125             * Returns an enumeration over the specified collection.  This provides
4126             * interoperability with legacy APIs that require an enumeration
4127             * as input.
4128             *
4129             * @param c the collection for which an enumeration is to be returned.
4130             * @return an enumeration over the specified collection.
4131             * @see Enumeration
4132             */
4133            public static <T> Enumeration<T> enumeration(final Collection<T> c) {
4134                return new Enumeration<T>() {
4135                    private final Iterator<T> i = c.iterator();
4136
4137                    public boolean hasMoreElements() {
4138                        return i.hasNext();
4139                    }
4140
4141                    public T nextElement() {
4142                        return i.next();
4143                    }
4144                };
4145            }
4146
4147            /**
4148             * Returns an array list containing the elements returned by the
4149             * specified enumeration in the order they are returned by the
4150             * enumeration.  This method provides interoperability between
4151             * legacy APIs that return enumerations and new APIs that require
4152             * collections.
4153             *
4154             * @param e enumeration providing elements for the returned
4155             *          array list
4156             * @return an array list containing the elements returned
4157             *         by the specified enumeration.
4158             * @since 1.4
4159             * @see Enumeration
4160             * @see ArrayList
4161             */
4162            public static <T> ArrayList<T> list(Enumeration<T> e) {
4163                ArrayList<T> l = new ArrayList<T>();
4164                while (e.hasMoreElements())
4165                    l.add(e.nextElement());
4166                return l;
4167            }
4168
4169            /**
4170             * Returns true if the specified arguments are equal, or both null.
4171             */
4172            private static boolean eq(Object o1, Object o2) {
4173                return (o1 == null ? o2 == null : o1.equals(o2));
4174            }
4175
4176            /**
4177             * Returns the number of elements in the specified collection equal to the
4178             * specified object.  More formally, returns the number of elements
4179             * <tt>e</tt> in the collection such that
4180             * <tt>(o == null ? e == null : o.equals(e))</tt>.
4181             *
4182             * @param c the collection in which to determine the frequency
4183             *     of <tt>o</tt>
4184             * @param o the object whose frequency is to be determined
4185             * @throws NullPointerException if <tt>c</tt> is null
4186             * @since 1.5
4187             */
4188            public static int frequency(Collection<?> c, Object o) {
4189                int result = 0;
4190                if (o == null) {
4191                    for (Object e : c)
4192                        if (e == null)
4193                            result++;
4194                } else {
4195                    for (Object e : c)
4196                        if (o.equals(e))
4197                            result++;
4198                }
4199                return result;
4200            }
4201
4202            /**
4203             * Returns <tt>true</tt> if the two specified collections have no
4204             * elements in common.
4205             *
4206             * <p>Care must be exercised if this method is used on collections that
4207             * do not comply with the general contract for <tt>Collection</tt>.
4208             * Implementations may elect to iterate over either collection and test
4209             * for containment in the other collection (or to perform any equivalent
4210             * computation).  If either collection uses a nonstandard equality test
4211             * (as does a {@link SortedSet} whose ordering is not <i>compatible with
4212             * equals</i>, or the key set of an {@link IdentityHashMap}), both
4213             * collections must use the same nonstandard equality test, or the
4214             * result of this method is undefined.
4215             *
4216             * <p>Note that it is permissible to pass the same collection in both
4217             * parameters, in which case the method will return true if and only if
4218             * the collection is empty.
4219             *
4220             * @param c1 a collection
4221             * @param c2 a collection
4222             * @throws NullPointerException if either collection is null
4223             * @since 1.5
4224             */
4225            public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
4226                /*
4227                 * We're going to iterate through c1 and test for inclusion in c2.
4228                 * If c1 is a Set and c2 isn't, swap the collections.  Otherwise,
4229                 * place the shorter collection in c1.  Hopefully this heuristic
4230                 * will minimize the cost of the operation.
4231                 */
4232                if ((c1 instanceof  Set) && !(c2 instanceof  Set)
4233                        || (c1.size() > c2.size())) {
4234                    Collection<?> tmp = c1;
4235                    c1 = c2;
4236                    c2 = tmp;
4237                }
4238
4239                for (Object e : c1)
4240                    if (c2.contains(e))
4241                        return false;
4242                return true;
4243            }
4244
4245            /**
4246             * Adds all of the specified elements to the specified collection.
4247             * Elements to be added may be specified individually or as an array.
4248             * The behavior of this convenience method is identical to that of
4249             * <tt>c.addAll(Arrays.asList(elements))</tt>, but this method is likely
4250             * to run significantly faster under most implementations.
4251             *
4252             * <p>When elements are specified individually, this method provides a
4253             * convenient way to add a few elements to an existing collection:
4254             * <pre>
4255             *     Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
4256             * </pre>
4257             *
4258             * @param c the collection into which <tt>elements</tt> are to be inserted
4259             * @param elements the elements to insert into <tt>c</tt>
4260             * @return <tt>true</tt> if the collection changed as a result of the call
4261             * @throws UnsupportedOperationException if <tt>c</tt> does not support
4262             *         the <tt>add</tt> operation
4263             * @throws NullPointerException if <tt>elements</tt> contains one or more
4264             *         null values and <tt>c</tt> does not permit null elements, or
4265             *         if <tt>c</tt> or <tt>elements</tt> are <tt>null</tt>
4266             * @throws IllegalArgumentException if some property of a value in
4267             *         <tt>elements</tt> prevents it from being added to <tt>c</tt>
4268             * @see Collection#addAll(Collection)
4269             * @since 1.5
4270             */
4271            public static <T> boolean addAll(Collection<? super  T> c,
4272                    T... elements) {
4273                boolean result = false;
4274                for (T element : elements)
4275                    result |= c.add(element);
4276                return result;
4277            }
4278
4279            /**
4280             * Returns a set backed by the specified map.  The resulting set displays
4281             * the same ordering, concurrency, and performance characteristics as the
4282             * backing map.  In essence, this factory method provides a {@link Set}
4283             * implementation corresponding to any {@link Map} implementation.  There
4284             * is no need to use this method on a {@link Map} implementation that
4285             * already has a corresponding {@link Set} implementation (such as {@link
4286             * HashMap} or {@link TreeMap}).
4287             *
4288             * <p>Each method invocation on the set returned by this method results in
4289             * exactly one method invocation on the backing map or its <tt>keySet</tt>
4290             * view, with one exception.  The <tt>addAll</tt> method is implemented
4291             * as a sequence of <tt>put</tt> invocations on the backing map.
4292             *
4293             * <p>The specified map must be empty at the time this method is invoked,
4294             * and should not be accessed directly after this method returns.  These
4295             * conditions are ensured if the map is created empty, passed directly
4296             * to this method, and no reference to the map is retained, as illustrated
4297             * in the following code fragment:
4298             * <pre>
4299             *    Set&lt;Object&gt; weakHashSet = Collections.newSetFromMap(
4300             *        new WeakHashMap&lt;Object, Boolean&gt;());
4301             * </pre>
4302             *
4303             * @param map the backing map
4304             * @return the set backed by the map
4305             * @throws IllegalArgumentException if <tt>map</tt> is not empty
4306             * @since 1.6
4307             */
4308            public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
4309                return new SetFromMap<E>(map);
4310            }
4311
4312            /**
4313             * @serial include
4314             */
4315            private static class SetFromMap<E> extends AbstractSet<E> implements 
4316                    Set<E>, Serializable {
4317                private final Map<E, Boolean> m; // The backing map
4318                private transient Set<E> s; // Its keySet
4319
4320                SetFromMap(Map<E, Boolean> map) {
4321                    if (!map.isEmpty())
4322                        throw new IllegalArgumentException("Map is non-empty");
4323                    m = map;
4324                    s = map.keySet();
4325                }
4326
4327                public void clear() {
4328                    m.clear();
4329                }
4330
4331                public int size() {
4332                    return m.size();
4333                }
4334
4335                public boolean isEmpty() {
4336                    return m.isEmpty();
4337                }
4338
4339                public boolean contains(Object o) {
4340                    return m.containsKey(o);
4341                }
4342
4343                public boolean remove(Object o) {
4344                    return m.remove(o) != null;
4345                }
4346
4347                public boolean add(E e) {
4348                    return m.put(e, Boolean.TRUE) == null;
4349                }
4350
4351                public Iterator<E> iterator() {
4352                    return s.iterator();
4353                }
4354
4355                public Object[] toArray() {
4356                    return s.toArray();
4357                }
4358
4359                public <T> T[] toArray(T[] a) {
4360                    return s.toArray(a);
4361                }
4362
4363                public String toString() {
4364                    return s.toString();
4365                }
4366
4367                public int hashCode() {
4368                    return s.hashCode();
4369                }
4370
4371                public boolean equals(Object o) {
4372                    return o == this  || s.equals(o);
4373                }
4374
4375                public boolean containsAll(Collection<?> c) {
4376                    return s.containsAll(c);
4377                }
4378
4379                public boolean removeAll(Collection<?> c) {
4380                    return s.removeAll(c);
4381                }
4382
4383                public boolean retainAll(Collection<?> c) {
4384                    return s.retainAll(c);
4385                }
4386
4387                // addAll is the only inherited implementation
4388
4389                private static final long serialVersionUID = 2454657854757543876L;
4390
4391                private void readObject(java.io.ObjectInputStream stream)
4392                        throws IOException, ClassNotFoundException {
4393                    stream.defaultReadObject();
4394                    s = m.keySet();
4395                }
4396            }
4397
4398            /**
4399             * Returns a view of a {@link Deque} as a Last-in-first-out (Lifo)
4400             * {@link Queue}. Method <tt>add</tt> is mapped to <tt>push</tt>,
4401             * <tt>remove</tt> is mapped to <tt>pop</tt> and so on. This
4402             * view can be useful when you would like to use a method
4403             * requiring a <tt>Queue</tt> but you need Lifo ordering.
4404             *
4405             * <p>Each method invocation on the queue returned by this method
4406             * results in exactly one method invocation on the backing deque, with
4407             * one exception.  The {@link Queue#addAll addAll} method is
4408             * implemented as a sequence of {@link Deque#addFirst addFirst}
4409             * invocations on the backing deque.
4410             *
4411             * @param deque the deque
4412             * @return the queue
4413             * @since  1.6
4414             */
4415            public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
4416                return new AsLIFOQueue<T>(deque);
4417            }
4418
4419            /**
4420             * @serial include
4421             */
4422            static class AsLIFOQueue<E> extends AbstractQueue<E> implements 
4423                    Queue<E>, Serializable {
4424                private static final long serialVersionUID = 1802017725587941708L;
4425                private final Deque<E> q;
4426
4427                AsLIFOQueue(Deque<E> q) {
4428                    this .q = q;
4429                }
4430
4431                public boolean add(E e) {
4432                    q.addFirst(e);
4433                    return true;
4434                }
4435
4436                public boolean offer(E e) {
4437                    return q.offerFirst(e);
4438                }
4439
4440                public E poll() {
4441                    return q.pollFirst();
4442                }
4443
4444                public E remove() {
4445                    return q.removeFirst();
4446                }
4447
4448                public E peek() {
4449                    return q.peekFirst();
4450                }
4451
4452                public E element() {
4453                    return q.getFirst();
4454                }
4455
4456                public void clear() {
4457                    q.clear();
4458                }
4459
4460                public int size() {
4461                    return q.size();
4462                }
4463
4464                public boolean isEmpty() {
4465                    return q.isEmpty();
4466                }
4467
4468                public boolean contains(Object o) {
4469                    return q.contains(o);
4470                }
4471
4472                public boolean remove(Object o) {
4473                    return q.remove(o);
4474                }
4475
4476                public Iterator<E> iterator() {
4477                    return q.iterator();
4478                }
4479
4480                public Object[] toArray() {
4481                    return q.toArray();
4482                }
4483
4484                public <T> T[] toArray(T[] a) {
4485                    return q.toArray(a);
4486                }
4487
4488                public String toString() {
4489                    return q.toString();
4490                }
4491
4492                public boolean containsAll(Collection<?> c) {
4493                    return q.containsAll(c);
4494                }
4495
4496                public boolean removeAll(Collection<?> c) {
4497                    return q.removeAll(c);
4498                }
4499
4500                public boolean retainAll(Collection<?> c) {
4501                    return q.retainAll(c);
4502                }
4503                // We use inherited addAll; forwarding addAll would be wrong
4504            }
4505        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.