Save This Page
Home » openjdk-7 » java » util » [javadoc | source]
    1   /*
    2    * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
    3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
    4    *
    5    * This code is free software; you can redistribute it and/or modify it
    6    * under the terms of the GNU General Public License version 2 only, as
    7    * published by the Free Software Foundation.  Sun designates this
    8    * particular file as subject to the "Classpath" exception as provided
    9    * by Sun in the LICENSE file that accompanied this code.
   10    *
   11    * This code is distributed in the hope that it will be useful, but WITHOUT
   12    * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   13    * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   14    * version 2 for more details (a copy is included in the LICENSE file that
   15    * accompanied this code).
   16    *
   17    * You should have received a copy of the GNU General Public License version
   18    * 2 along with this work; if not, write to the Free Software Foundation,
   19    * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   20    *
   21    * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
   22    * CA 95054 USA or visit www.sun.com if you need additional information or
   23    * have any questions.
   24    */
   25   
   26   package java.util;
   27   import java.io.Serializable;
   28   import java.io.ObjectOutputStream;
   29   import java.io.IOException;
   30   import java.lang.reflect.Array;
   31   
   32   /**
   33    * This class consists exclusively of static methods that operate on or return
   34    * collections.  It contains polymorphic algorithms that operate on
   35    * collections, "wrappers", which return a new collection backed by a
   36    * specified collection, and a few other odds and ends.
   37    *
   38    * <p>The methods of this class all throw a <tt>NullPointerException</tt>
   39    * if the collections or class objects provided to them are null.
   40    *
   41    * <p>The documentation for the polymorphic algorithms contained in this class
   42    * generally includes a brief description of the <i>implementation</i>.  Such
   43    * descriptions should be regarded as <i>implementation notes</i>, rather than
   44    * parts of the <i>specification</i>.  Implementors should feel free to
   45    * substitute other algorithms, so long as the specification itself is adhered
   46    * to.  (For example, the algorithm used by <tt>sort</tt> does not have to be
   47    * a mergesort, but it does have to be <i>stable</i>.)
   48    *
   49    * <p>The "destructive" algorithms contained in this class, that is, the
   50    * algorithms that modify the collection on which they operate, are specified
   51    * to throw <tt>UnsupportedOperationException</tt> if the collection does not
   52    * support the appropriate mutation primitive(s), such as the <tt>set</tt>
   53    * method.  These algorithms may, but are not required to, throw this
   54    * exception if an invocation would have no effect on the collection.  For
   55    * example, invoking the <tt>sort</tt> method on an unmodifiable list that is
   56    * already sorted may or may not throw <tt>UnsupportedOperationException</tt>.
   57    *
   58    * <p>This class is a member of the
   59    * <a href="{@docRoot}/../technotes/guides/collections/index.html">
   60    * Java Collections Framework</a>.
   61    *
   62    * @author  Josh Bloch
   63    * @author  Neal Gafter
   64    * @see     Collection
   65    * @see     Set
   66    * @see     List
   67    * @see     Map
   68    * @since   1.2
   69    */
   70   
   71   public class Collections {
   72       // Suppresses default constructor, ensuring non-instantiability.
   73       private Collections() {
   74       }
   75   
   76       // Algorithms
   77   
   78       /*
   79        * Tuning parameters for algorithms - Many of the List algorithms have
   80        * two implementations, one of which is appropriate for RandomAccess
   81        * lists, the other for "sequential."  Often, the random access variant
   82        * yields better performance on small sequential access lists.  The
   83        * tuning parameters below determine the cutoff point for what constitutes
   84        * a "small" sequential access list for each algorithm.  The values below
   85        * were empirically determined to work well for LinkedList. Hopefully
   86        * they should be reasonable for other sequential access List
   87        * implementations.  Those doing performance work on this code would
   88        * do well to validate the values of these parameters from time to time.
   89        * (The first word of each tuning parameter name is the algorithm to which
   90        * it applies.)
   91        */
   92       private static final int BINARYSEARCH_THRESHOLD   = 5000;
   93       private static final int REVERSE_THRESHOLD        =   18;
   94       private static final int SHUFFLE_THRESHOLD        =    5;
   95       private static final int FILL_THRESHOLD           =   25;
   96       private static final int ROTATE_THRESHOLD         =  100;
   97       private static final int COPY_THRESHOLD           =   10;
   98       private static final int REPLACEALL_THRESHOLD     =   11;
   99       private static final int INDEXOFSUBLIST_THRESHOLD =   35;
  100   
  101       /**
  102        * Sorts the specified list into ascending order, according to the
  103        * <i>natural ordering</i> of its elements.  All elements in the list must
  104        * implement the <tt>Comparable</tt> interface.  Furthermore, all elements
  105        * in the list must be <i>mutually comparable</i> (that is,
  106        * <tt>e1.compareTo(e2)</tt> must not throw a <tt>ClassCastException</tt>
  107        * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p>
  108        *
  109        * This sort is guaranteed to be <i>stable</i>:  equal elements will
  110        * not be reordered as a result of the sort.<p>
  111        *
  112        * The specified list must be modifiable, but need not be resizable.<p>
  113        *
  114        * The sorting algorithm is a modified mergesort (in which the merge is
  115        * omitted if the highest element in the low sublist is less than the
  116        * lowest element in the high sublist).  This algorithm offers guaranteed
  117        * n log(n) performance.
  118        *
  119        * This implementation dumps the specified list into an array, sorts
  120        * the array, and iterates over the list resetting each element
  121        * from the corresponding position in the array.  This avoids the
  122        * n<sup>2</sup> log(n) performance that would result from attempting
  123        * to sort a linked list in place.
  124        *
  125        * @param  list the list to be sorted.
  126        * @throws ClassCastException if the list contains elements that are not
  127        *         <i>mutually comparable</i> (for example, strings and integers).
  128        * @throws UnsupportedOperationException if the specified list's
  129        *         list-iterator does not support the <tt>set</tt> operation.
  130        * @see Comparable
  131        */
  132       public static <T extends Comparable<? super T>> void sort(List<T> list) {
  133           Object[] a = list.toArray();
  134           Arrays.sort(a);
  135           ListIterator<T> i = list.listIterator();
  136           for (int j=0; j<a.length; j++) {
  137               i.next();
  138               i.set((T)a[j]);
  139           }
  140       }
  141   
  142       /**
  143        * Sorts the specified list according to the order induced by the
  144        * specified comparator.  All elements in the list must be <i>mutually
  145        * comparable</i> using the specified comparator (that is,
  146        * <tt>c.compare(e1, e2)</tt> must not throw a <tt>ClassCastException</tt>
  147        * for any elements <tt>e1</tt> and <tt>e2</tt> in the list).<p>
  148        *
  149        * This sort is guaranteed to be <i>stable</i>:  equal elements will
  150        * not be reordered as a result of the sort.<p>
  151        *
  152        * The sorting algorithm is a modified mergesort (in which the merge is
  153        * omitted if the highest element in the low sublist is less than the
  154        * lowest element in the high sublist).  This algorithm offers guaranteed
  155        * n log(n) performance.
  156        *
  157        * The specified list must be modifiable, but need not be resizable.
  158        * This implementation dumps the specified list into an array, sorts
  159        * the array, and iterates over the list resetting each element
  160        * from the corresponding position in the array.  This avoids the
  161        * n<sup>2</sup> log(n) performance that would result from attempting
  162        * to sort a linked list in place.
  163        *
  164        * @param  list the list to be sorted.
  165        * @param  c the comparator to determine the order of the list.  A
  166        *        <tt>null</tt> value indicates that the elements' <i>natural
  167        *        ordering</i> should be used.
  168        * @throws ClassCastException if the list contains elements that are not
  169        *         <i>mutually comparable</i> using the specified comparator.
  170        * @throws UnsupportedOperationException if the specified list's
  171        *         list-iterator does not support the <tt>set</tt> operation.
  172        * @see Comparator
  173        */
  174       public static <T> void sort(List<T> list, Comparator<? super T> c) {
  175           Object[] a = list.toArray();
  176           Arrays.sort(a, (Comparator)c);
  177           ListIterator i = list.listIterator();
  178           for (int j=0; j<a.length; j++) {
  179               i.next();
  180               i.set(a[j]);
  181           }
  182       }
  183   
  184   
  185       /**
  186        * Searches the specified list for the specified object using the binary
  187        * search algorithm.  The list must be sorted into ascending order
  188        * according to the {@linkplain Comparable natural ordering} of its
  189        * elements (as by the {@link #sort(List)} method) prior to making this
  190        * call.  If it is not sorted, the results are undefined.  If the list
  191        * contains multiple elements equal to the specified object, there is no
  192        * guarantee which one will be found.
  193        *
  194        * <p>This method runs in log(n) time for a "random access" list (which
  195        * provides near-constant-time positional access).  If the specified list
  196        * does not implement the {@link RandomAccess} interface and is large,
  197        * this method will do an iterator-based binary search that performs
  198        * O(n) link traversals and O(log n) element comparisons.
  199        *
  200        * @param  list the list to be searched.
  201        * @param  key the key to be searched for.
  202        * @return the index of the search key, if it is contained in the list;
  203        *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  204        *         <i>insertion point</i> is defined as the point at which the
  205        *         key would be inserted into the list: the index of the first
  206        *         element greater than the key, or <tt>list.size()</tt> if all
  207        *         elements in the list are less than the specified key.  Note
  208        *         that this guarantees that the return value will be &gt;= 0 if
  209        *         and only if the key is found.
  210        * @throws ClassCastException if the list contains elements that are not
  211        *         <i>mutually comparable</i> (for example, strings and
  212        *         integers), or the search key is not mutually comparable
  213        *         with the elements of the list.
  214        */
  215       public static <T>
  216       int binarySearch(List<? extends Comparable<? super T>> list, T key) {
  217           if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
  218               return Collections.indexedBinarySearch(list, key);
  219           else
  220               return Collections.iteratorBinarySearch(list, key);
  221       }
  222   
  223       private static <T>
  224       int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key)
  225       {
  226           int low = 0;
  227           int high = list.size()-1;
  228   
  229           while (low <= high) {
  230               int mid = (low + high) >>> 1;
  231               Comparable<? super T> midVal = list.get(mid);
  232               int cmp = midVal.compareTo(key);
  233   
  234               if (cmp < 0)
  235                   low = mid + 1;
  236               else if (cmp > 0)
  237                   high = mid - 1;
  238               else
  239                   return mid; // key found
  240           }
  241           return -(low + 1);  // key not found
  242       }
  243   
  244       private static <T>
  245       int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
  246       {
  247           int low = 0;
  248           int high = list.size()-1;
  249           ListIterator<? extends Comparable<? super T>> i = list.listIterator();
  250   
  251           while (low <= high) {
  252               int mid = (low + high) >>> 1;
  253               Comparable<? super T> midVal = get(i, mid);
  254               int cmp = midVal.compareTo(key);
  255   
  256               if (cmp < 0)
  257                   low = mid + 1;
  258               else if (cmp > 0)
  259                   high = mid - 1;
  260               else
  261                   return mid; // key found
  262           }
  263           return -(low + 1);  // key not found
  264       }
  265   
  266       /**
  267        * Gets the ith element from the given list by repositioning the specified
  268        * list listIterator.
  269        */
  270       private static <T> T get(ListIterator<? extends T> i, int index) {
  271           T obj = null;
  272           int pos = i.nextIndex();
  273           if (pos <= index) {
  274               do {
  275                   obj = i.next();
  276               } while (pos++ < index);
  277           } else {
  278               do {
  279                   obj = i.previous();
  280               } while (--pos > index);
  281           }
  282           return obj;
  283       }
  284   
  285       /**
  286        * Searches the specified list for the specified object using the binary
  287        * search algorithm.  The list must be sorted into ascending order
  288        * according to the specified comparator (as by the
  289        * {@link #sort(List, Comparator) sort(List, Comparator)}
  290        * method), prior to making this call.  If it is
  291        * not sorted, the results are undefined.  If the list contains multiple
  292        * elements equal to the specified object, there is no guarantee which one
  293        * will be found.
  294        *
  295        * <p>This method runs in log(n) time for a "random access" list (which
  296        * provides near-constant-time positional access).  If the specified list
  297        * does not implement the {@link RandomAccess} interface and is large,
  298        * this method will do an iterator-based binary search that performs
  299        * O(n) link traversals and O(log n) element comparisons.
  300        *
  301        * @param  list the list to be searched.
  302        * @param  key the key to be searched for.
  303        * @param  c the comparator by which the list is ordered.
  304        *         A <tt>null</tt> value indicates that the elements'
  305        *         {@linkplain Comparable natural ordering} should be used.
  306        * @return the index of the search key, if it is contained in the list;
  307        *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
  308        *         <i>insertion point</i> is defined as the point at which the
  309        *         key would be inserted into the list: the index of the first
  310        *         element greater than the key, or <tt>list.size()</tt> if all
  311        *         elements in the list are less than the specified key.  Note
  312        *         that this guarantees that the return value will be &gt;= 0 if
  313        *         and only if the key is found.
  314        * @throws ClassCastException if the list contains elements that are not
  315        *         <i>mutually comparable</i> using the specified comparator,
  316        *         or the search key is not mutually comparable with the
  317        *         elements of the list using this comparator.
  318        */
  319       public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
  320           if (c==null)
  321               return binarySearch((List) list, key);
  322   
  323           if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
  324               return Collections.indexedBinarySearch(list, key, c);
  325           else
  326               return Collections.iteratorBinarySearch(list, key, c);
  327       }
  328   
  329       private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
  330           int low = 0;
  331           int high = l.size()-1;
  332   
  333           while (low <= high) {
  334               int mid = (low + high) >>> 1;
  335               T midVal = l.get(mid);
  336               int cmp = c.compare(midVal, key);
  337   
  338               if (cmp < 0)
  339                   low = mid + 1;
  340               else if (cmp > 0)
  341                   high = mid - 1;
  342               else
  343                   return mid; // key found
  344           }
  345           return -(low + 1);  // key not found
  346       }
  347   
  348       private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
  349           int low = 0;
  350           int high = l.size()-1;
  351           ListIterator<? extends T> i = l.listIterator();
  352   
  353           while (low <= high) {
  354               int mid = (low + high) >>> 1;
  355               T midVal = get(i, mid);
  356               int cmp = c.compare(midVal, key);
  357   
  358               if (cmp < 0)
  359                   low = mid + 1;
  360               else if (cmp > 0)
  361                   high = mid - 1;
  362               else
  363                   return mid; // key found
  364           }
  365           return -(low + 1);  // key not found
  366       }
  367   
  368       private interface SelfComparable extends Comparable<SelfComparable> {}
  369   
  370   
  371       /**
  372        * Reverses the order of the elements in the specified list.<p>
  373        *
  374        * This method runs in linear time.
  375        *
  376        * @param  list the list whose elements are to be reversed.
  377        * @throws UnsupportedOperationException if the specified list or
  378        *         its list-iterator does not support the <tt>set</tt> operation.
  379        */
  380       public static void reverse(List<?> list) {
  381           int size = list.size();
  382           if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
  383               for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
  384                   swap(list, i, j);
  385           } else {
  386               ListIterator fwd = list.listIterator();
  387               ListIterator rev = list.listIterator(size);
  388               for (int i=0, mid=list.size()>>1; i<mid; i++) {
  389                   Object tmp = fwd.next();
  390                   fwd.set(rev.previous());
  391                   rev.set(tmp);
  392               }
  393           }
  394       }
  395   
  396       /**
  397        * Randomly permutes the specified list using a default source of
  398        * randomness.  All permutations occur with approximately equal
  399        * likelihood.<p>
  400        *
  401        * The hedge "approximately" is used in the foregoing description because
  402        * default source of randomness is only approximately an unbiased source
  403        * of independently chosen bits. If it were a perfect source of randomly
  404        * chosen bits, then the algorithm would choose permutations with perfect
  405        * uniformity.<p>
  406        *
  407        * This implementation traverses the list backwards, from the last element
  408        * up to the second, repeatedly swapping a randomly selected element into
  409        * the "current position".  Elements are randomly selected from the
  410        * portion of the list that runs from the first element to the current
  411        * position, inclusive.<p>
  412        *
  413        * This method runs in linear time.  If the specified list does not
  414        * implement the {@link RandomAccess} interface and is large, this
  415        * implementation dumps the specified list into an array before shuffling
  416        * it, and dumps the shuffled array back into the list.  This avoids the
  417        * quadratic behavior that would result from shuffling a "sequential
  418        * access" list in place.
  419        *
  420        * @param  list the list to be shuffled.
  421        * @throws UnsupportedOperationException if the specified list or
  422        *         its list-iterator does not support the <tt>set</tt> operation.
  423        */
  424       public static void shuffle(List<?> list) {
  425           if (r == null) {
  426               r = new Random();
  427           }
  428           shuffle(list, r);
  429       }
  430       private static Random r;
  431   
  432       /**
  433        * Randomly permute the specified list using the specified source of
  434        * randomness.  All permutations occur with equal likelihood
  435        * assuming that the source of randomness is fair.<p>
  436        *
  437        * This implementation traverses the list backwards, from the last element
  438        * up to the second, repeatedly swapping a randomly selected element into
  439        * the "current position".  Elements are randomly selected from the
  440        * portion of the list that runs from the first element to the current
  441        * position, inclusive.<p>
  442        *
  443        * This method runs in linear time.  If the specified list does not
  444        * implement the {@link RandomAccess} interface and is large, this
  445        * implementation dumps the specified list into an array before shuffling
  446        * it, and dumps the shuffled array back into the list.  This avoids the
  447        * quadratic behavior that would result from shuffling a "sequential
  448        * access" list in place.
  449        *
  450        * @param  list the list to be shuffled.
  451        * @param  rnd the source of randomness to use to shuffle the list.
  452        * @throws UnsupportedOperationException if the specified list or its
  453        *         list-iterator does not support the <tt>set</tt> operation.
  454        */
  455       public static void shuffle(List<?> list, Random rnd) {
  456           int size = list.size();
  457           if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
  458               for (int i=size; i>1; i--)
  459                   swap(list, i-1, rnd.nextInt(i));
  460           } else {
  461               Object arr[] = list.toArray();
  462   
  463               // Shuffle array
  464               for (int i=size; i>1; i--)
  465                   swap(arr, i-1, rnd.nextInt(i));
  466   
  467               // Dump array back into list
  468               ListIterator it = list.listIterator();
  469               for (int i=0; i<arr.length; i++) {
  470                   it.next();
  471                   it.set(arr[i]);
  472               }
  473           }
  474       }
  475   
  476       /**
  477        * Swaps the elements at the specified positions in the specified list.
  478        * (If the specified positions are equal, invoking this method leaves
  479        * the list unchanged.)
  480        *
  481        * @param list The list in which to swap elements.
  482        * @param i the index of one element to be swapped.
  483        * @param j the index of the other element to be swapped.
  484        * @throws IndexOutOfBoundsException if either <tt>i</tt> or <tt>j</tt>
  485        *         is out of range (i &lt; 0 || i &gt;= list.size()
  486        *         || j &lt; 0 || j &gt;= list.size()).
  487        * @since 1.4
  488        */
  489       public static void swap(List<?> list, int i, int j) {
  490           final List l = list;
  491           l.set(i, l.set(j, l.get(i)));
  492       }
  493   
  494       /**
  495        * Swaps the two specified elements in the specified array.
  496        */
  497       private static void swap(Object[] arr, int i, int j) {
  498           Object tmp = arr[i];
  499           arr[i] = arr[j];
  500           arr[j] = tmp;
  501       }
  502   
  503       /**
  504        * Replaces all of the elements of the specified list with the specified
  505        * element. <p>
  506        *
  507        * This method runs in linear time.
  508        *
  509        * @param  list the list to be filled with the specified element.
  510        * @param  obj The element with which to fill the specified list.
  511        * @throws UnsupportedOperationException if the specified list or its
  512        *         list-iterator does not support the <tt>set</tt> operation.
  513        */
  514       public static <T> void fill(List<? super T> list, T obj) {
  515           int size = list.size();
  516   
  517           if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
  518               for (int i=0; i<size; i++)
  519                   list.set(i, obj);
  520           } else {
  521               ListIterator<? super T> itr = list.listIterator();
  522               for (int i=0; i<size; i++) {
  523                   itr.next();
  524                   itr.set(obj);
  525               }
  526           }
  527       }
  528   
  529       /**
  530        * Copies all of the elements from one list into another.  After the
  531        * operation, the index of each copied element in the destination list
  532        * will be identical to its index in the source list.  The destination
  533        * list must be at least as long as the source list.  If it is longer, the
  534        * remaining elements in the destination list are unaffected. <p>
  535        *
  536        * This method runs in linear time.
  537        *
  538        * @param  dest The destination list.
  539        * @param  src The source list.
  540        * @throws IndexOutOfBoundsException if the destination list is too small
  541        *         to contain the entire source List.
  542        * @throws UnsupportedOperationException if the destination list's
  543        *         list-iterator does not support the <tt>set</tt> operation.
  544        */
  545       public static <T> void copy(List<? super T> dest, List<? extends T> src) {
  546           int srcSize = src.size();
  547           if (srcSize > dest.size())
  548               throw new IndexOutOfBoundsException("Source does not fit in dest");
  549   
  550           if (srcSize < COPY_THRESHOLD ||
  551               (src instanceof RandomAccess && dest instanceof RandomAccess)) {
  552               for (int i=0; i<srcSize; i++)
  553                   dest.set(i, src.get(i));
  554           } else {
  555               ListIterator<? super T> di=dest.listIterator();
  556               ListIterator<? extends T> si=src.listIterator();
  557               for (int i=0; i<srcSize; i++) {
  558                   di.next();
  559                   di.set(si.next());
  560               }
  561           }
  562       }
  563   
  564       /**
  565        * Returns the minimum element of the given collection, according to the
  566        * <i>natural ordering</i> of its elements.  All elements in the
  567        * collection must implement the <tt>Comparable</tt> interface.
  568        * Furthermore, all elements in the collection must be <i>mutually
  569        * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
  570        * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
  571        * <tt>e2</tt> in the collection).<p>
  572        *
  573        * This method iterates over the entire collection, hence it requires
  574        * time proportional to the size of the collection.
  575        *
  576        * @param  coll the collection whose minimum element is to be determined.
  577        * @return the minimum element of the given collection, according
  578        *         to the <i>natural ordering</i> of its elements.
  579        * @throws ClassCastException if the collection contains elements that are
  580        *         not <i>mutually comparable</i> (for example, strings and
  581        *         integers).
  582        * @throws NoSuchElementException if the collection is empty.
  583        * @see Comparable
  584        */
  585       public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
  586           Iterator<? extends T> i = coll.iterator();
  587           T candidate = i.next();
  588   
  589           while (i.hasNext()) {
  590               T next = i.next();
  591               if (next.compareTo(candidate) < 0)
  592                   candidate = next;
  593           }
  594           return candidate;
  595       }
  596   
  597       /**
  598        * Returns the minimum element of the given collection, according to the
  599        * order induced by the specified comparator.  All elements in the
  600        * collection must be <i>mutually comparable</i> by the specified
  601        * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
  602        * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
  603        * <tt>e2</tt> in the collection).<p>
  604        *
  605        * This method iterates over the entire collection, hence it requires
  606        * time proportional to the size of the collection.
  607        *
  608        * @param  coll the collection whose minimum element is to be determined.
  609        * @param  comp the comparator with which to determine the minimum element.
  610        *         A <tt>null</tt> value indicates that the elements' <i>natural
  611        *         ordering</i> should be used.
  612        * @return the minimum element of the given collection, according
  613        *         to the specified comparator.
  614        * @throws ClassCastException if the collection contains elements that are
  615        *         not <i>mutually comparable</i> using the specified comparator.
  616        * @throws NoSuchElementException if the collection is empty.
  617        * @see Comparable
  618        */
  619       public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
  620           if (comp==null)
  621               return (T)min((Collection<SelfComparable>) (Collection) coll);
  622   
  623           Iterator<? extends T> i = coll.iterator();
  624           T candidate = i.next();
  625   
  626           while (i.hasNext()) {
  627               T next = i.next();
  628               if (comp.compare(next, candidate) < 0)
  629                   candidate = next;
  630           }
  631           return candidate;
  632       }
  633   
  634       /**
  635        * Returns the maximum element of the given collection, according to the
  636        * <i>natural ordering</i> of its elements.  All elements in the
  637        * collection must implement the <tt>Comparable</tt> interface.
  638        * Furthermore, all elements in the collection must be <i>mutually
  639        * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
  640        * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
  641        * <tt>e2</tt> in the collection).<p>
  642        *
  643        * This method iterates over the entire collection, hence it requires
  644        * time proportional to the size of the collection.
  645        *
  646        * @param  coll the collection whose maximum element is to be determined.
  647        * @return the maximum element of the given collection, according
  648        *         to the <i>natural ordering</i> of its elements.
  649        * @throws ClassCastException if the collection contains elements that are
  650        *         not <i>mutually comparable</i> (for example, strings and
  651        *         integers).
  652        * @throws NoSuchElementException if the collection is empty.
  653        * @see Comparable
  654        */
  655       public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
  656           Iterator<? extends T> i = coll.iterator();
  657           T candidate = i.next();
  658   
  659           while (i.hasNext()) {
  660               T next = i.next();
  661               if (next.compareTo(candidate) > 0)
  662                   candidate = next;
  663           }
  664           return candidate;
  665       }
  666   
  667       /**
  668        * Returns the maximum element of the given collection, according to the
  669        * order induced by the specified comparator.  All elements in the
  670        * collection must be <i>mutually comparable</i> by the specified
  671        * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
  672        * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
  673        * <tt>e2</tt> in the collection).<p>
  674        *
  675        * This method iterates over the entire collection, hence it requires
  676        * time proportional to the size of the collection.
  677        *
  678        * @param  coll the collection whose maximum element is to be determined.
  679        * @param  comp the comparator with which to determine the maximum element.
  680        *         A <tt>null</tt> value indicates that the elements' <i>natural
  681        *        ordering</i> should be used.
  682        * @return the maximum element of the given collection, according
  683        *         to the specified comparator.
  684        * @throws ClassCastException if the collection contains elements that are
  685        *         not <i>mutually comparable</i> using the specified comparator.
  686        * @throws NoSuchElementException if the collection is empty.
  687        * @see Comparable
  688        */
  689       public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
  690           if (comp==null)
  691               return (T)max((Collection<SelfComparable>) (Collection) coll);
  692   
  693           Iterator<? extends T> i = coll.iterator();
  694           T candidate = i.next();
  695   
  696           while (i.hasNext()) {
  697               T next = i.next();
  698               if (comp.compare(next, candidate) > 0)
  699                   candidate = next;
  700           }
  701           return candidate;
  702       }
  703   
  704       /**
  705        * Rotates the elements in the specified list by the specified distance.
  706        * After calling this method, the element at index <tt>i</tt> will be
  707        * the element previously at index <tt>(i - distance)</tt> mod
  708        * <tt>list.size()</tt>, for all values of <tt>i</tt> between <tt>0</tt>
  709        * and <tt>list.size()-1</tt>, inclusive.  (This method has no effect on
  710        * the size of the list.)
  711        *
  712        * <p>For example, suppose <tt>list</tt> comprises<tt> [t, a, n, k, s]</tt>.
  713        * After invoking <tt>Collections.rotate(list, 1)</tt> (or
  714        * <tt>Collections.rotate(list, -4)</tt>), <tt>list</tt> will comprise
  715        * <tt>[s, t, a, n, k]</tt>.
  716        *
  717        * <p>Note that this method can usefully be applied to sublists to
  718        * move one or more elements within a list while preserving the
  719        * order of the remaining elements.  For example, the following idiom
  720        * moves the element at index <tt>j</tt> forward to position
  721        * <tt>k</tt> (which must be greater than or equal to <tt>j</tt>):
  722        * <pre>
  723        *     Collections.rotate(list.subList(j, k+1), -1);
  724        * </pre>
  725        * To make this concrete, suppose <tt>list</tt> comprises
  726        * <tt>[a, b, c, d, e]</tt>.  To move the element at index <tt>1</tt>
  727        * (<tt>b</tt>) forward two positions, perform the following invocation:
  728        * <pre>
  729        *     Collections.rotate(l.subList(1, 4), -1);
  730        * </pre>
  731        * The resulting list is <tt>[a, c, d, b, e]</tt>.
  732        *
  733        * <p>To move more than one element forward, increase the absolute value
  734        * of the rotation distance.  To move elements backward, use a positive
  735        * shift distance.
  736        *
  737        * <p>If the specified list is small or implements the {@link
  738        * RandomAccess} interface, this implementation exchanges the first
  739        * element into the location it should go, and then repeatedly exchanges
  740        * the displaced element into the location it should go until a displaced
  741        * element is swapped into the first element.  If necessary, the process
  742        * is repeated on the second and successive elements, until the rotation
  743        * is complete.  If the specified list is large and doesn't implement the
  744        * <tt>RandomAccess</tt> interface, this implementation breaks the
  745        * list into two sublist views around index <tt>-distance mod size</tt>.
  746        * Then the {@link #reverse(List)} method is invoked on each sublist view,
  747        * and finally it is invoked on the entire list.  For a more complete
  748        * description of both algorithms, see Section 2.3 of Jon Bentley's
  749        * <i>Programming Pearls</i> (Addison-Wesley, 1986).
  750        *
  751        * @param list the list to be rotated.
  752        * @param distance the distance to rotate the list.  There are no
  753        *        constraints on this value; it may be zero, negative, or
  754        *        greater than <tt>list.size()</tt>.
  755        * @throws UnsupportedOperationException if the specified list or
  756        *         its list-iterator does not support the <tt>set</tt> operation.
  757        * @since 1.4
  758        */
  759       public static void rotate(List<?> list, int distance) {
  760           if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
  761               rotate1(list, distance);
  762           else
  763               rotate2(list, distance);
  764       }
  765   
  766       private static <T> void rotate1(List<T> list, int distance) {
  767           int size = list.size();
  768           if (size == 0)
  769               return;
  770           distance = distance % size;
  771           if (distance < 0)
  772               distance += size;
  773           if (distance == 0)
  774               return;
  775   
  776           for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
  777               T displaced = list.get(cycleStart);
  778               int i = cycleStart;
  779               do {
  780                   i += distance;
  781                   if (i >= size)
  782                       i -= size;
  783                   displaced = list.set(i, displaced);
  784                   nMoved ++;
  785               } while(i != cycleStart);
  786           }
  787       }
  788   
  789       private static void rotate2(List<?> list, int distance) {
  790           int size = list.size();
  791           if (size == 0)
  792               return;
  793           int mid =  -distance % size;
  794           if (mid < 0)
  795               mid += size;
  796           if (mid == 0)
  797               return;
  798   
  799           reverse(list.subList(0, mid));
  800           reverse(list.subList(mid, size));
  801           reverse(list);
  802       }
  803   
  804       /**
  805        * Replaces all occurrences of one specified value in a list with another.
  806        * More formally, replaces with <tt>newVal</tt> each element <tt>e</tt>
  807        * in <tt>list</tt> such that
  808        * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
  809        * (This method has no effect on the size of the list.)
  810        *
  811        * @param list the list in which replacement is to occur.
  812        * @param oldVal the old value to be replaced.
  813        * @param newVal the new value with which <tt>oldVal</tt> is to be
  814        *        replaced.
  815        * @return <tt>true</tt> if <tt>list</tt> contained one or more elements
  816        *         <tt>e</tt> such that
  817        *         <tt>(oldVal==null ?  e==null : oldVal.equals(e))</tt>.
  818        * @throws UnsupportedOperationException if the specified list or
  819        *         its list-iterator does not support the <tt>set</tt> operation.
  820        * @since  1.4
  821        */
  822       public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
  823           boolean result = false;
  824           int size = list.size();
  825           if (size < REPLACEALL_THRESHOLD || list instanceof RandomAccess) {
  826               if (oldVal==null) {
  827                   for (int i=0; i<size; i++) {
  828                       if (list.get(i)==null) {
  829                           list.set(i, newVal);
  830                           result = true;
  831                       }
  832                   }
  833               } else {
  834                   for (int i=0; i<size; i++) {
  835                       if (oldVal.equals(list.get(i))) {
  836                           list.set(i, newVal);
  837                           result = true;
  838                       }
  839                   }
  840               }
  841           } else {
  842               ListIterator<T> itr=list.listIterator();
  843               if (oldVal==null) {
  844                   for (int i=0; i<size; i++) {
  845                       if (itr.next()==null) {
  846                           itr.set(newVal);
  847                           result = true;
  848                       }
  849                   }
  850               } else {
  851                   for (int i=0; i<size; i++) {
  852                       if (oldVal.equals(itr.next())) {
  853                           itr.set(newVal);
  854                           result = true;
  855                       }
  856                   }
  857               }
  858           }
  859           return result;
  860       }
  861   
  862       /**
  863        * Returns the starting position of the first occurrence of the specified
  864        * target list within the specified source list, or -1 if there is no
  865        * such occurrence.  More formally, returns the lowest index <tt>i</tt>
  866        * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
  867        * or -1 if there is no such index.  (Returns -1 if
  868        * <tt>target.size() > source.size()</tt>.)
  869        *
  870        * <p>This implementation uses the "brute force" technique of scanning
  871        * over the source list, looking for a match with the target at each
  872        * location in turn.
  873        *
  874        * @param source the list in which to search for the first occurrence
  875        *        of <tt>target</tt>.
  876        * @param target the list to search for as a subList of <tt>source</tt>.
  877        * @return the starting position of the first occurrence of the specified
  878        *         target list within the specified source list, or -1 if there
  879        *         is no such occurrence.
  880        * @since  1.4
  881        */
  882       public static int indexOfSubList(List<?> source, List<?> target) {
  883           int sourceSize = source.size();
  884           int targetSize = target.size();
  885           int maxCandidate = sourceSize - targetSize;
  886   
  887           if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
  888               (source instanceof RandomAccess&&target instanceof RandomAccess)) {
  889           nextCand:
  890               for (int candidate = 0; candidate <= maxCandidate; candidate++) {
  891                   for (int i=0, j=candidate; i<targetSize; i++, j++)
  892                       if (!eq(target.get(i), source.get(j)))
  893                           continue nextCand;  // Element mismatch, try next cand
  894                   return candidate;  // All elements of candidate matched target
  895               }
  896           } else {  // Iterator version of above algorithm
  897               ListIterator<?> si = source.listIterator();
  898           nextCand:
  899               for (int candidate = 0; candidate <= maxCandidate; candidate++) {
  900                   ListIterator<?> ti = target.listIterator();
  901                   for (int i=0; i<targetSize; i++) {
  902                       if (!eq(ti.next(), si.next())) {
  903                           // Back up source iterator to next candidate
  904                           for (int j=0; j<i; j++)
  905                               si.previous();
  906                           continue nextCand;
  907                       }
  908                   }
  909                   return candidate;
  910               }
  911           }
  912           return -1;  // No candidate matched the target
  913       }
  914   
  915       /**
  916        * Returns the starting position of the last occurrence of the specified
  917        * target list within the specified source list, or -1 if there is no such
  918        * occurrence.  More formally, returns the highest index <tt>i</tt>
  919        * such that <tt>source.subList(i, i+target.size()).equals(target)</tt>,
  920        * or -1 if there is no such index.  (Returns -1 if
  921        * <tt>target.size() > source.size()</tt>.)
  922        *
  923        * <p>This implementation uses the "brute force" technique of iterating
  924        * over the source list, looking for a match with the target at each
  925        * location in turn.
  926        *
  927        * @param source the list in which to search for the last occurrence
  928        *        of <tt>target</tt>.
  929        * @param target the list to search for as a subList of <tt>source</tt>.
  930        * @return the starting position of the last occurrence of the specified
  931        *         target list within the specified source list, or -1 if there
  932        *         is no such occurrence.
  933        * @since  1.4
  934        */
  935       public static int lastIndexOfSubList(List<?> source, List<?> target) {
  936           int sourceSize = source.size();
  937           int targetSize = target.size();
  938           int maxCandidate = sourceSize - targetSize;
  939   
  940           if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
  941               source instanceof RandomAccess) {   // Index access version
  942           nextCand:
  943               for (int candidate = maxCandidate; candidate >= 0; candidate--) {
  944                   for (int i=0, j=candidate; i<targetSize; i++, j++)
  945                       if (!eq(target.get(i), source.get(j)))
  946                           continue nextCand;  // Element mismatch, try next cand
  947                   return candidate;  // All elements of candidate matched target
  948               }
  949           } else {  // Iterator version of above algorithm
  950               if (maxCandidate < 0)
  951                   return -1;
  952               ListIterator<?> si = source.listIterator(maxCandidate);
  953           nextCand:
  954               for (int candidate = maxCandidate; candidate >= 0; candidate--) {
  955                   ListIterator<?> ti = target.listIterator();
  956                   for (int i=0; i<targetSize; i++) {
  957                       if (!eq(ti.next(), si.next())) {
  958                           if (candidate != 0) {
  959                               // Back up source iterator to next candidate
  960                               for (int j=0; j<=i+1; j++)
  961                                   si.previous();
  962                           }
  963                           continue nextCand;
  964                       }
  965                   }
  966                   return candidate;
  967               }
  968           }
  969           return -1;  // No candidate matched the target
  970       }
  971   
  972   
  973       // Unmodifiable Wrappers
  974   
  975       /**
  976        * Returns an unmodifiable view of the specified collection.  This method
  977        * allows modules to provide users with "read-only" access to internal
  978        * collections.  Query operations on the returned collection "read through"
  979        * to the specified collection, and attempts to modify the returned
  980        * collection, whether direct or via its iterator, result in an
  981        * <tt>UnsupportedOperationException</tt>.<p>
  982        *
  983        * The returned collection does <i>not</i> pass the hashCode and equals
  984        * operations through to the backing collection, but relies on
  985        * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods.  This
  986        * is necessary to preserve the contracts of these operations in the case
  987        * that the backing collection is a set or a list.<p>
  988        *
  989        * The returned collection will be serializable if the specified collection
  990        * is serializable.
  991        *
  992        * @param  c the collection for which an unmodifiable view is to be
  993        *         returned.
  994        * @return an unmodifiable view of the specified collection.
  995        */
  996       public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
  997           return new UnmodifiableCollection<T>(c);
  998       }
  999   
 1000       /**
 1001        * @serial include
 1002        */
 1003       static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
 1004           private static final long serialVersionUID = 1820017752578914078L;
 1005   
 1006           final Collection<? extends E> c;
 1007   
 1008           UnmodifiableCollection(Collection<? extends E> c) {
 1009               if (c==null)
 1010                   throw new NullPointerException();
 1011               this.c = c;
 1012           }
 1013   
 1014           public int size()                   {return c.size();}
 1015           public boolean isEmpty()            {return c.isEmpty();}
 1016           public boolean contains(Object o)   {return c.contains(o);}
 1017           public Object[] toArray()           {return c.toArray();}
 1018           public <T> T[] toArray(T[] a)       {return c.toArray(a);}
 1019           public String toString()            {return c.toString();}
 1020   
 1021           public Iterator<E> iterator() {
 1022               return new Iterator<E>() {
 1023                   private final Iterator<? extends E> i = c.iterator();
 1024   
 1025                   public boolean hasNext() {return i.hasNext();}
 1026                   public E next()          {return i.next();}
 1027                   public void remove() {
 1028                       throw new UnsupportedOperationException();
 1029                   }
 1030               };
 1031           }
 1032   
 1033           public boolean add(E e) {
 1034               throw new UnsupportedOperationException();
 1035           }
 1036           public boolean remove(Object o) {
 1037               throw new UnsupportedOperationException();
 1038           }
 1039   
 1040           public boolean containsAll(Collection<?> coll) {
 1041               return c.containsAll(coll);
 1042           }
 1043           public boolean addAll(Collection<? extends E> coll) {
 1044               throw new UnsupportedOperationException();
 1045           }
 1046           public boolean removeAll(Collection<?> coll) {
 1047               throw new UnsupportedOperationException();
 1048           }
 1049           public boolean retainAll(Collection<?> coll) {
 1050               throw new UnsupportedOperationException();
 1051           }
 1052           public void clear() {
 1053               throw new UnsupportedOperationException();
 1054           }
 1055       }
 1056   
 1057       /**
 1058        * Returns an unmodifiable view of the specified set.  This method allows
 1059        * modules to provide users with "read-only" access to internal sets.
 1060        * Query operations on the returned set "read through" to the specified
 1061        * set, and attempts to modify the returned set, whether direct or via its
 1062        * iterator, result in an <tt>UnsupportedOperationException</tt>.<p>
 1063        *
 1064        * The returned set will be serializable if the specified set
 1065        * is serializable.
 1066        *
 1067        * @param  s the set for which an unmodifiable view is to be returned.
 1068        * @return an unmodifiable view of the specified set.
 1069        */
 1070       public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
 1071           return new UnmodifiableSet<T>(s);
 1072       }
 1073   
 1074       /**
 1075        * @serial include
 1076        */
 1077       static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
 1078                                    implements Set<E>, Serializable {
 1079           private static final long serialVersionUID = -9215047833775013803L;
 1080   
 1081           UnmodifiableSet(Set<? extends E> s)     {super(s);}
 1082           public boolean equals(Object o) {return o == this || c.equals(o);}
 1083           public int hashCode()           {return c.hashCode();}
 1084       }
 1085   
 1086       /**
 1087        * Returns an unmodifiable view of the specified sorted set.  This method
 1088        * allows modules to provide users with "read-only" access to internal
 1089        * sorted sets.  Query operations on the returned sorted set "read
 1090        * through" to the specified sorted set.  Attempts to modify the returned
 1091        * sorted set, whether direct, via its iterator, or via its
 1092        * <tt>subSet</tt>, <tt>headSet</tt>, or <tt>tailSet</tt> views, result in
 1093        * an <tt>UnsupportedOperationException</tt>.<p>
 1094        *
 1095        * The returned sorted set will be serializable if the specified sorted set
 1096        * is serializable.
 1097        *
 1098        * @param s the sorted set for which an unmodifiable view is to be
 1099        *        returned.
 1100        * @return an unmodifiable view of the specified sorted set.
 1101        */
 1102       public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
 1103           return new UnmodifiableSortedSet<T>(s);
 1104       }
 1105   
 1106       /**
 1107        * @serial include
 1108        */
 1109       static class UnmodifiableSortedSet<E>
 1110                                extends UnmodifiableSet<E>
 1111                                implements SortedSet<E>, Serializable {
 1112           private static final long serialVersionUID = -4929149591599911165L;
 1113           private final SortedSet<E> ss;
 1114   
 1115           UnmodifiableSortedSet(SortedSet<E> s) {super(s); ss = s;}
 1116   
 1117           public Comparator<? super E> comparator() {return ss.comparator();}
 1118   
 1119           public SortedSet<E> subSet(E fromElement, E toElement) {
 1120               return new UnmodifiableSortedSet<E>(ss.subSet(fromElement,toElement));
 1121           }
 1122           public SortedSet<E> headSet(E toElement) {
 1123               return new UnmodifiableSortedSet<E>(ss.headSet(toElement));
 1124           }
 1125           public SortedSet<E> tailSet(E fromElement) {
 1126               return new UnmodifiableSortedSet<E>(ss.tailSet(fromElement));
 1127           }
 1128   
 1129           public E first()                   {return ss.first();}
 1130           public E last()                    {return ss.last();}
 1131       }
 1132   
 1133       /**
 1134        * Returns an unmodifiable view of the specified list.  This method allows
 1135        * modules to provide users with "read-only" access to internal
 1136        * lists.  Query operations on the returned list "read through" to the
 1137        * specified list, and attempts to modify the returned list, whether
 1138        * direct or via its iterator, result in an
 1139        * <tt>UnsupportedOperationException</tt>.<p>
 1140        *
 1141        * The returned list will be serializable if the specified list
 1142        * is serializable. Similarly, the returned list will implement
 1143        * {@link RandomAccess} if the specified list does.
 1144        *
 1145        * @param  list the list for which an unmodifiable view is to be returned.
 1146        * @return an unmodifiable view of the specified list.
 1147        */
 1148       public static <T> List<T> unmodifiableList(List<? extends T> list) {
 1149           return (list instanceof RandomAccess ?
 1150                   new UnmodifiableRandomAccessList<T>(list) :
 1151                   new UnmodifiableList<T>(list));
 1152       }
 1153   
 1154       /**
 1155        * @serial include
 1156        */
 1157       static class UnmodifiableList<E> extends UnmodifiableCollection<E>
 1158                                     implements List<E> {
 1159           private static final long serialVersionUID = -283967356065247728L;
 1160           final List<? extends E> list;
 1161   
 1162           UnmodifiableList(List<? extends E> list) {
 1163               super(list);
 1164               this.list = list;
 1165           }
 1166   
 1167           public boolean equals(Object o) {return o == this || list.equals(o);}
 1168           public int hashCode()           {return list.hashCode();}
 1169   
 1170           public E get(int index) {return list.get(index);}
 1171           public E set(int index, E element) {
 1172               throw new UnsupportedOperationException();
 1173           }
 1174           public void add(int index, E element) {
 1175               throw new UnsupportedOperationException();
 1176           }
 1177           public E remove(int index) {
 1178               throw new UnsupportedOperationException();
 1179           }
 1180           public int indexOf(Object o)            {return list.indexOf(o);}
 1181           public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}
 1182           public boolean addAll(int index, Collection<? extends E> c) {
 1183               throw new UnsupportedOperationException();
 1184           }
 1185           public ListIterator<E> listIterator()   {return listIterator(0);}
 1186   
 1187           public ListIterator<E> listIterator(final int index) {
 1188               return new ListIterator<E>() {
 1189                   private final ListIterator<? extends E> i
 1190                       = list.listIterator(index);
 1191   
 1192                   public boolean hasNext()     {return i.hasNext();}
 1193                   public E next()              {return i.next();}
 1194                   public boolean hasPrevious() {return i.hasPrevious();}
 1195                   public E previous()          {return i.previous();}
 1196                   public int nextIndex()       {return i.nextIndex();}
 1197                   public int previousIndex()   {return i.previousIndex();}
 1198   
 1199                   public void remove() {
 1200                       throw new UnsupportedOperationException();
 1201                   }
 1202                   public void set(E e) {
 1203                       throw new UnsupportedOperationException();
 1204                   }
 1205                   public void add(E e) {
 1206                       throw new UnsupportedOperationException();
 1207                   }
 1208               };
 1209           }
 1210   
 1211           public List<E> subList(int fromIndex, int toIndex) {
 1212               return new UnmodifiableList<E>(list.subList(fromIndex, toIndex));
 1213           }
 1214   
 1215           /**
 1216            * UnmodifiableRandomAccessList instances are serialized as
 1217            * UnmodifiableList instances to allow them to be deserialized
 1218            * in pre-1.4 JREs (which do not have UnmodifiableRandomAccessList).
 1219            * This method inverts the transformation.  As a beneficial
 1220            * side-effect, it also grafts the RandomAccess marker onto
 1221            * UnmodifiableList instances that were serialized in pre-1.4 JREs.
 1222            *
 1223            * Note: Unfortunately, UnmodifiableRandomAccessList instances
 1224            * serialized in 1.4.1 and deserialized in 1.4 will become
 1225            * UnmodifiableList instances, as this method was missing in 1.4.
 1226            */
 1227           private Object readResolve() {
 1228               return (list instanceof RandomAccess
 1229                       ? new UnmodifiableRandomAccessList<E>(list)
 1230                       : this);
 1231           }
 1232       }
 1233   
 1234       /**
 1235        * @serial include
 1236        */
 1237       static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E>
 1238                                                 implements RandomAccess
 1239       {
 1240           UnmodifiableRandomAccessList(List<? extends E> list) {
 1241               super(list);
 1242           }
 1243   
 1244           public List<E> subList(int fromIndex, int toIndex) {
 1245               return new UnmodifiableRandomAccessList<E>(
 1246                   list.subList(fromIndex, toIndex));
 1247           }
 1248   
 1249           private static final long serialVersionUID = -2542308836966382001L;
 1250   
 1251           /**
 1252            * Allows instances to be deserialized in pre-1.4 JREs (which do
 1253            * not have UnmodifiableRandomAccessList).  UnmodifiableList has
 1254            * a readResolve method that inverts this transformation upon
 1255            * deserialization.
 1256            */
 1257           private Object writeReplace() {
 1258               return new UnmodifiableList<E>(list);
 1259           }
 1260       }
 1261   
 1262       /**
 1263        * Returns an unmodifiable view of the specified map.  This method
 1264        * allows modules to provide users with "read-only" access to internal
 1265        * maps.  Query operations on the returned map "read through"
 1266        * to the specified map, and attempts to modify the returned
 1267        * map, whether direct or via its collection views, result in an
 1268        * <tt>UnsupportedOperationException</tt>.<p>
 1269        *
 1270        * The returned map will be serializable if the specified map
 1271        * is serializable.
 1272        *
 1273        * @param  m the map for which an unmodifiable view is to be returned.
 1274        * @return an unmodifiable view of the specified map.
 1275        */
 1276       public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
 1277           return new UnmodifiableMap<K,V>(m);
 1278       }
 1279   
 1280       /**
 1281        * @serial include
 1282        */
 1283       private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
 1284           private static final long serialVersionUID = -1034234728574286014L;
 1285   
 1286           private final Map<? extends K, ? extends V> m;
 1287   
 1288           UnmodifiableMap(Map<? extends K, ? extends V> m) {
 1289               if (m==null)
 1290                   throw new NullPointerException();
 1291               this.m = m;
 1292           }
 1293   
 1294           public int size()                        {return m.size();}
 1295           public boolean isEmpty()                 {return m.isEmpty();}
 1296           public boolean containsKey(Object key)   {return m.containsKey(key);}
 1297           public boolean containsValue(Object val) {return m.containsValue(val);}
 1298           public V get(Object key)                 {return m.get(key);}
 1299   
 1300           public V put(K key, V value) {
 1301               throw new UnsupportedOperationException();
 1302           }
 1303           public V remove(Object key) {
 1304               throw new UnsupportedOperationException();
 1305           }
 1306           public void putAll(Map<? extends K, ? extends V> m) {
 1307               throw new UnsupportedOperationException();
 1308           }
 1309           public void clear() {
 1310               throw new UnsupportedOperationException();
 1311           }
 1312   
 1313           private transient Set<K> keySet = null;
 1314           private transient Set<Map.Entry<K,V>> entrySet = null;
 1315           private transient Collection<V> values = null;
 1316   
 1317           public Set<K> keySet() {
 1318               if (keySet==null)
 1319                   keySet = unmodifiableSet(m.keySet());
 1320               return keySet;
 1321           }
 1322   
 1323           public Set<Map.Entry<K,V>> entrySet() {
 1324               if (entrySet==null)
 1325                   entrySet = new UnmodifiableEntrySet<K,V>(m.entrySet());
 1326               return entrySet;
 1327           }
 1328   
 1329           public Collection<V> values() {
 1330               if (values==null)
 1331                   values = unmodifiableCollection(m.values());
 1332               return values;
 1333           }
 1334   
 1335           public boolean equals(Object o) {return o == this || m.equals(o);}
 1336           public int hashCode()           {return m.hashCode();}
 1337           public String toString()        {return m.toString();}
 1338   
 1339           /**
 1340            * We need this class in addition to UnmodifiableSet as
 1341            * Map.Entries themselves permit modification of the backing Map
 1342            * via their setValue operation.  This class is subtle: there are
 1343            * many possible attacks that must be thwarted.
 1344            *
 1345            * @serial include
 1346            */
 1347           static class UnmodifiableEntrySet<K,V>
 1348               extends UnmodifiableSet<Map.Entry<K,V>> {
 1349               private static final long serialVersionUID = 7854390611657943733L;
 1350   
 1351               UnmodifiableEntrySet(Set<? extends Map.Entry<? extends K, ? extends V>> s) {
 1352                   super((Set)s);
 1353               }
 1354               public Iterator<Map.Entry<K,V>> iterator() {
 1355                   return new Iterator<Map.Entry<K,V>>() {
 1356                       private final Iterator<? extends Map.Entry<? extends K, ? extends V>> i = c.iterator();
 1357   
 1358                       public boolean hasNext() {
 1359                           return i.hasNext();
 1360                       }
 1361                       public Map.Entry<K,V> next() {
 1362                           return new UnmodifiableEntry<K,V>(i.next());
 1363                       }
 1364                       public void remove() {
 1365                           throw new UnsupportedOperationException();
 1366                       }
 1367                   };
 1368               }
 1369   
 1370               public Object[] toArray() {
 1371                   Object[] a = c.toArray();
 1372                   for (int i=0; i<a.length; i++)
 1373                       a[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)a[i]);
 1374                   return a;
 1375               }
 1376   
 1377               public <T> T[] toArray(T[] a) {
 1378                   // We don't pass a to c.toArray, to avoid window of
 1379                   // vulnerability wherein an unscrupulous multithreaded client
 1380                   // could get his hands on raw (unwrapped) Entries from c.
 1381                   Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
 1382   
 1383                   for (int i=0; i<arr.length; i++)
 1384                       arr[i] = new UnmodifiableEntry<K,V>((Map.Entry<K,V>)arr[i]);
 1385   
 1386                   if (arr.length > a.length)
 1387                       return (T[])arr;
 1388   
 1389                   System.arraycopy(arr, 0, a, 0, arr.length);
 1390                   if (a.length > arr.length)
 1391                       a[arr.length] = null;
 1392                   return a;
 1393               }
 1394   
 1395               /**
 1396                * This method is overridden to protect the backing set against
 1397                * an object with a nefarious equals function that senses
 1398                * that the equality-candidate is Map.Entry and calls its
 1399                * setValue method.
 1400                */
 1401               public boolean contains(Object o) {
 1402                   if (!(o instanceof Map.Entry))
 1403                       return false;
 1404                   return c.contains(
 1405                       new UnmodifiableEntry<Object,Object>((Map.Entry<?,?>) o));
 1406               }
 1407   
 1408               /**
 1409                * The next two methods are overridden to protect against
 1410                * an unscrupulous List whose contains(Object o) method senses
 1411                * when o is a Map.Entry, and calls o.setValue.
 1412                */
 1413               public boolean containsAll(Collection<?> coll) {
 1414                   Iterator<?> e = coll.iterator();
 1415                   while (e.hasNext())
 1416                       if (!contains(e.next())) // Invokes safe contains() above
 1417                           return false;
 1418                   return true;
 1419               }
 1420               public boolean equals(Object o) {
 1421                   if (o == this)
 1422                       return true;
 1423   
 1424                   if (!(o instanceof Set))
 1425                       return false;
 1426                   Set s = (Set) o;
 1427                   if (s.size() != c.size())
 1428                       return false;
 1429                   return containsAll(s); // Invokes safe containsAll() above
 1430               }
 1431   
 1432               /**
 1433                * This "wrapper class" serves two purposes: it prevents
 1434                * the client from modifying the backing Map, by short-circuiting
 1435                * the setValue method, and it protects the backing Map against
 1436                * an ill-behaved Map.Entry that attempts to modify another
 1437                * Map Entry when asked to perform an equality check.
 1438                */
 1439               private static class UnmodifiableEntry<K,V> implements Map.Entry<K,V> {
 1440                   private Map.Entry<? extends K, ? extends V> e;
 1441   
 1442                   UnmodifiableEntry(Map.Entry<? extends K, ? extends V> e) {this.e = e;}
 1443   
 1444                   public K getKey()         {return e.getKey();}
 1445                   public V getValue()  {return e.getValue();}
 1446                   public V setValue(V value) {
 1447                       throw new UnsupportedOperationException();
 1448                   }
 1449                   public int hashCode()     {return e.hashCode();}
 1450                   public boolean equals(Object o) {
 1451                       if (!(o instanceof Map.Entry))
 1452                           return false;
 1453                       Map.Entry t = (Map.Entry)o;
 1454                       return eq(e.getKey(),   t.getKey()) &&
 1455                              eq(e.getValue(), t.getValue());
 1456                   }
 1457                   public String toString()  {return e.toString();}
 1458               }
 1459           }
 1460       }
 1461   
 1462       /**
 1463        * Returns an unmodifiable view of the specified sorted map.  This method
 1464        * allows modules to provide users with "read-only" access to internal
 1465        * sorted maps.  Query operations on the returned sorted map "read through"
 1466        * to the specified sorted map.  Attempts to modify the returned
 1467        * sorted map, whether direct, via its collection views, or via its
 1468        * <tt>subMap</tt>, <tt>headMap</tt>, or <tt>tailMap</tt> views, result in
 1469        * an <tt>UnsupportedOperationException</tt>.<p>
 1470        *
 1471        * The returned sorted map will be serializable if the specified sorted map
 1472        * is serializable.
 1473        *
 1474        * @param m the sorted map for which an unmodifiable view is to be
 1475        *        returned.
 1476        * @return an unmodifiable view of the specified sorted map.
 1477        */
 1478       public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m) {
 1479           return new UnmodifiableSortedMap<K,V>(m);
 1480       }
 1481   
 1482       /**
 1483        * @serial include
 1484        */
 1485       static class UnmodifiableSortedMap<K,V>
 1486             extends UnmodifiableMap<K,V>
 1487             implements SortedMap<K,V>, Serializable {
 1488           private static final long serialVersionUID = -8806743815996713206L;
 1489   
 1490           private final SortedMap<K, ? extends V> sm;
 1491   
 1492           UnmodifiableSortedMap(SortedMap<K, ? extends V> m) {super(m); sm = m;}
 1493   
 1494           public Comparator<? super K> comparator() {return sm.comparator();}
 1495   
 1496           public SortedMap<K,V> subMap(K fromKey, K toKey) {
 1497               return new UnmodifiableSortedMap<K,V>(sm.subMap(fromKey, toKey));
 1498           }
 1499           public SortedMap<K,V> headMap(K toKey) {
 1500               return new UnmodifiableSortedMap<K,V>(sm.headMap(toKey));
 1501           }
 1502           public SortedMap<K,V> tailMap(K fromKey) {
 1503               return new UnmodifiableSortedMap<K,V>(sm.tailMap(fromKey));
 1504           }
 1505   
 1506           public K firstKey()           {return sm.firstKey();}
 1507           public K lastKey()            {return sm.lastKey();}
 1508       }
 1509   
 1510   
 1511       // Synch Wrappers
 1512   
 1513       /**
 1514        * Returns a synchronized (thread-safe) collection backed by the specified
 1515        * collection.  In order to guarantee serial access, it is critical that
 1516        * <strong>all</strong> access to the backing collection is accomplished
 1517        * through the returned collection.<p>
 1518        *
 1519        * It is imperative that the user manually synchronize on the returned
 1520        * collection when iterating over it:
 1521        * <pre>
 1522        *  Collection c = Collections.synchronizedCollection(myCollection);
 1523        *     ...
 1524        *  synchronized(c) {
 1525        *      Iterator i = c.iterator(); // Must be in the synchronized block
 1526        *      while (i.hasNext())
 1527        *         foo(i.next());
 1528        *  }
 1529        * </pre>
 1530        * Failure to follow this advice may result in non-deterministic behavior.
 1531        *
 1532        * <p>The returned collection does <i>not</i> pass the <tt>hashCode</tt>
 1533        * and <tt>equals</tt> operations through to the backing collection, but
 1534        * relies on <tt>Object</tt>'s equals and hashCode methods.  This is
 1535        * necessary to preserve the contracts of these operations in the case
 1536        * that the backing collection is a set or a list.<p>
 1537        *
 1538        * The returned collection will be serializable if the specified collection
 1539        * is serializable.
 1540        *
 1541        * @param  c the collection to be "wrapped" in a synchronized collection.
 1542        * @return a synchronized view of the specified collection.
 1543        */
 1544       public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
 1545           return new SynchronizedCollection<T>(c);
 1546       }
 1547   
 1548       static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
 1549           return new SynchronizedCollection<T>(c, mutex);
 1550       }
 1551   
 1552       /**
 1553        * @serial include
 1554        */
 1555       static class SynchronizedCollection<E> implements Collection<E>, Serializable {
 1556           private static final long serialVersionUID = 3053995032091335093L;
 1557   
 1558           final Collection<E> c;  // Backing Collection
 1559           final Object mutex;     // Object on which to synchronize
 1560   
 1561           SynchronizedCollection(Collection<E> c) {
 1562               if (c==null)
 1563                   throw new NullPointerException();
 1564               this.c = c;
 1565               mutex = this;
 1566           }
 1567           SynchronizedCollection(Collection<E> c, Object mutex) {
 1568               this.c = c;
 1569               this.mutex = mutex;
 1570           }
 1571   
 1572           public int size() {
 1573               synchronized(mutex) {return c.size();}
 1574           }
 1575           public boolean isEmpty() {
 1576               synchronized(mutex) {return c.isEmpty();}
 1577           }
 1578           public boolean contains(Object o) {
 1579               synchronized(mutex) {return c.contains(o);}
 1580           }
 1581           public Object[] toArray() {
 1582               synchronized(mutex) {return c.toArray();}
 1583           }
 1584           public <T> T[] toArray(T[] a) {
 1585               synchronized(mutex) {return c.toArray(a);}
 1586           }
 1587   
 1588           public Iterator<E> iterator() {
 1589               return c.iterator(); // Must be manually synched by user!
 1590           }
 1591   
 1592           public boolean add(E e) {
 1593               synchronized(mutex) {return c.add(e);}
 1594           }
 1595           public boolean remove(Object o) {
 1596               synchronized(mutex) {return c.remove(o);}
 1597           }
 1598   
 1599           public boolean containsAll(Collection<?> coll) {
 1600               synchronized(mutex) {return c.containsAll(coll);}
 1601           }
 1602           public boolean addAll(Collection<? extends E> coll) {
 1603               synchronized(mutex) {return c.addAll(coll);}
 1604           }
 1605           public boolean removeAll(Collection<?> coll) {
 1606               synchronized(mutex) {return c.removeAll(coll);}
 1607           }
 1608           public boolean retainAll(Collection<?> coll) {
 1609               synchronized(mutex) {return c.retainAll(coll);}
 1610           }
 1611           public void clear() {
 1612               synchronized(mutex) {c.clear();}
 1613           }
 1614           public String toString() {
 1615               synchronized(mutex) {return c.toString();}
 1616           }
 1617           private void writeObject(ObjectOutputStream s) throws IOException {
 1618               synchronized(mutex) {s.defaultWriteObject();}
 1619           }
 1620       }
 1621   
 1622       /**
 1623        * Returns a synchronized (thread-safe) set backed by the specified
 1624        * set.  In order to guarantee serial access, it is critical that
 1625        * <strong>all</strong> access to the backing set is accomplished
 1626        * through the returned set.<p>
 1627        *
 1628        * It is imperative that the user manually synchronize on the returned
 1629        * set when iterating over it:
 1630        * <pre>
 1631        *  Set s = Collections.synchronizedSet(new HashSet());
 1632        *      ...
 1633        *  synchronized(s) {
 1634        *      Iterator i = s.iterator(); // Must be in the synchronized block
 1635        *      while (i.hasNext())
 1636        *          foo(i.next());
 1637        *  }
 1638        * </pre>
 1639        * Failure to follow this advice may result in non-deterministic behavior.
 1640        *
 1641        * <p>The returned set will be serializable if the specified set is
 1642        * serializable.
 1643        *
 1644        * @param  s the set to be "wrapped" in a synchronized set.
 1645        * @return a synchronized view of the specified set.
 1646        */
 1647       public static <T> Set<T> synchronizedSet(Set<T> s) {
 1648           return new SynchronizedSet<T>(s);
 1649       }
 1650   
 1651       static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) {
 1652           return new SynchronizedSet<T>(s, mutex);
 1653       }
 1654   
 1655       /**
 1656        * @serial include
 1657        */
 1658       static class SynchronizedSet<E>
 1659             extends SynchronizedCollection<E>
 1660             implements Set<E> {
 1661           private static final long serialVersionUID = 487447009682186044L;
 1662   
 1663           SynchronizedSet(Set<E> s) {
 1664               super(s);
 1665           }
 1666           SynchronizedSet(Set<E> s, Object mutex) {
 1667               super(s, mutex);
 1668           }
 1669   
 1670           public boolean equals(Object o) {
 1671               synchronized(mutex) {return c.equals(o);}
 1672           }
 1673           public int hashCode() {
 1674               synchronized(mutex) {return c.hashCode();}
 1675           }
 1676       }
 1677   
 1678       /**
 1679        * Returns a synchronized (thread-safe) sorted set backed by the specified
 1680        * sorted set.  In order to guarantee serial access, it is critical that
 1681        * <strong>all</strong> access to the backing sorted set is accomplished
 1682        * through the returned sorted set (or its views).<p>
 1683        *
 1684        * It is imperative that the user manually synchronize on the returned
 1685        * sorted set when iterating over it or any of its <tt>subSet</tt>,
 1686        * <tt>headSet</tt>, or <tt>tailSet</tt> views.
 1687        * <pre>
 1688        *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
 1689        *      ...
 1690        *  synchronized(s) {
 1691        *      Iterator i = s.iterator(); // Must be in the synchronized block
 1692        *      while (i.hasNext())
 1693        *          foo(i.next());
 1694        *  }
 1695        * </pre>
 1696        * or:
 1697        * <pre>
 1698        *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
 1699        *  SortedSet s2 = s.headSet(foo);
 1700        *      ...
 1701        *  synchronized(s) {  // Note: s, not s2!!!
 1702        *      Iterator i = s2.iterator(); // Must be in the synchronized block
 1703        *      while (i.hasNext())
 1704        *          foo(i.next());
 1705        *  }
 1706        * </pre>
 1707        * Failure to follow this advice may result in non-deterministic behavior.
 1708        *
 1709        * <p>The returned sorted set will be serializable if the specified
 1710        * sorted set is serializable.
 1711        *
 1712        * @param  s the sorted set to be "wrapped" in a synchronized sorted set.
 1713        * @return a synchronized view of the specified sorted set.
 1714        */
 1715       public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) {
 1716           return new SynchronizedSortedSet<T>(s);
 1717       }
 1718   
 1719       /**
 1720        * @serial include
 1721        */
 1722       static class SynchronizedSortedSet<E>
 1723           extends SynchronizedSet<E>
 1724           implements SortedSet<E>
 1725       {
 1726           private static final long serialVersionUID = 8695801310862127406L;
 1727   
 1728           final private SortedSet<E> ss;
 1729   
 1730           SynchronizedSortedSet(SortedSet<E> s) {
 1731               super(s);
 1732               ss = s;
 1733           }
 1734           SynchronizedSortedSet(SortedSet<E> s, Object mutex) {
 1735               super(s, mutex);
 1736               ss = s;
 1737           }
 1738   
 1739           public Comparator<? super E> comparator() {
 1740               synchronized(mutex) {return ss.comparator();}
 1741           }
 1742   
 1743           public SortedSet<E> subSet(E fromElement, E toElement) {
 1744               synchronized(mutex) {
 1745                   return new SynchronizedSortedSet<E>(
 1746                       ss.subSet(fromElement, toElement), mutex);
 1747               }
 1748           }
 1749           public SortedSet<E> headSet(E toElement) {
 1750               synchronized(mutex) {
 1751                   return new SynchronizedSortedSet<E>(ss.headSet(toElement), mutex);
 1752               }
 1753           }
 1754           public SortedSet<E> tailSet(E fromElement) {
 1755               synchronized(mutex) {
 1756                  return new SynchronizedSortedSet<E>(ss.tailSet(fromElement),mutex);
 1757               }
 1758           }
 1759   
 1760           public E first() {
 1761               synchronized(mutex) {return ss.first();}
 1762           }
 1763           public E last() {
 1764               synchronized(mutex) {return ss.last();}
 1765           }
 1766       }
 1767   
 1768       /**
 1769        * Returns a synchronized (thread-safe) list backed by the specified
 1770        * list.  In order to guarantee serial access, it is critical that
 1771        * <strong>all</strong> access to the backing list is accomplished
 1772        * through the returned list.<p>
 1773        *
 1774        * It is imperative that the user manually synchronize on the returned
 1775        * list when iterating over it:
 1776        * <pre>
 1777        *  List list = Collections.synchronizedList(new ArrayList());
 1778        *      ...
 1779        *  synchronized(list) {
 1780        *      Iterator i = list.iterator(); // Must be in synchronized block
 1781        *      while (i.hasNext())
 1782        *          foo(i.next());
 1783        *  }
 1784        * </pre>
 1785        * Failure to follow this advice may result in non-deterministic behavior.
 1786        *
 1787        * <p>The returned list will be serializable if the specified list is
 1788        * serializable.
 1789        *
 1790        * @param  list the list to be "wrapped" in a synchronized list.
 1791        * @return a synchronized view of the specified list.
 1792        */
 1793       public static <T> List<T> synchronizedList(List<T> list) {
 1794           return (list instanceof RandomAccess ?
 1795                   new SynchronizedRandomAccessList<T>(list) :
 1796                   new SynchronizedList<T>(list));
 1797       }
 1798   
 1799       static <T> List<T> synchronizedList(List<T> list, Object mutex) {
 1800           return (list instanceof RandomAccess ?
 1801                   new SynchronizedRandomAccessList<T>(list, mutex) :
 1802                   new SynchronizedList<T>(list, mutex));
 1803       }
 1804   
 1805       /**
 1806        * @serial include
 1807        */
 1808       static class SynchronizedList<E>
 1809           extends SynchronizedCollection<E>
 1810           implements List<E> {
 1811           private static final long serialVersionUID = -7754090372962971524L;
 1812   
 1813           final List<E> list;
 1814   
 1815           SynchronizedList(List<E> list) {
 1816               super(list);
 1817               this.list = list;
 1818           }
 1819           SynchronizedList(List<E> list, Object mutex) {
 1820               super(list, mutex);
 1821               this.list = list;
 1822           }
 1823   
 1824           public boolean equals(Object o) {
 1825               synchronized(mutex) {return list.equals(o);}
 1826           }
 1827           public int hashCode() {
 1828               synchronized(mutex) {return list.hashCode();}
 1829           }
 1830   
 1831           public E get(int index) {
 1832               synchronized(mutex) {return list.get(index);}
 1833           }
 1834           public E set(int index, E element) {
 1835               synchronized(mutex) {return list.set(index, element);}
 1836           }
 1837           public void add(int index, E element) {
 1838               synchronized(mutex) {list.add(index, element);}
 1839           }
 1840           public E remove(int index) {
 1841               synchronized(mutex) {return list.remove(index);}
 1842           }
 1843   
 1844           public int indexOf(Object o) {
 1845               synchronized(mutex) {return list.indexOf(o);}
 1846           }
 1847           public int lastIndexOf(Object o) {
 1848               synchronized(mutex) {return list.lastIndexOf(o);}
 1849           }
 1850   
 1851           public boolean addAll(int index, Collection<? extends E> c) {
 1852               synchronized(mutex) {return list.addAll(index, c);}
 1853           }
 1854   
 1855           public ListIterator<E> listIterator() {
 1856               return list.listIterator(); // Must be manually synched by user
 1857           }
 1858   
 1859           public ListIterator<E> listIterator(int index) {
 1860               return list.listIterator(index); // Must be manually synched by user
 1861           }
 1862   
 1863           public List<E> subList(int fromIndex, int toIndex) {
 1864               synchronized(mutex) {
 1865                   return new SynchronizedList<E>(list.subList(fromIndex, toIndex),
 1866                                               mutex);
 1867               }
 1868           }
 1869   
 1870           /**
 1871            * SynchronizedRandomAccessList instances are serialized as
 1872            * SynchronizedList instances to allow them to be deserialized
 1873            * in pre-1.4 JREs (which do not have SynchronizedRandomAccessList).
 1874            * This method inverts the transformation.  As a beneficial
 1875            * side-effect, it also grafts the RandomAccess marker onto
 1876            * SynchronizedList instances that were serialized in pre-1.4 JREs.
 1877            *
 1878            * Note: Unfortunately, SynchronizedRandomAccessList instances
 1879            * serialized in 1.4.1 and deserialized in 1.4 will become
 1880            * SynchronizedList instances, as this method was missing in 1.4.
 1881            */
 1882           private Object readResolve() {
 1883               return (list instanceof RandomAccess
 1884                       ? new SynchronizedRandomAccessList<E>(list)
 1885                       : this);
 1886           }
 1887       }
 1888   
 1889       /**
 1890        * @serial include
 1891        */
 1892       static class SynchronizedRandomAccessList<E>
 1893           extends SynchronizedList<E>
 1894           implements RandomAccess {
 1895   
 1896           SynchronizedRandomAccessList(List<E> list) {
 1897               super(list);
 1898           }
 1899   
 1900           SynchronizedRandomAccessList(List<E> list, Object mutex) {
 1901               super(list, mutex);
 1902           }
 1903   
 1904           public List<E> subList(int fromIndex, int toIndex) {
 1905               synchronized(mutex) {
 1906                   return new SynchronizedRandomAccessList<E>(
 1907                       list.subList(fromIndex, toIndex), mutex);
 1908               }
 1909           }
 1910   
 1911           private static final long serialVersionUID = 1530674583602358482L;
 1912   
 1913           /**
 1914            * Allows instances to be deserialized in pre-1.4 JREs (which do
 1915            * not have SynchronizedRandomAccessList).  SynchronizedList has
 1916            * a readResolve method that inverts this transformation upon
 1917            * deserialization.
 1918            */
 1919           private Object writeReplace() {
 1920               return new SynchronizedList<E>(list);
 1921           }
 1922       }
 1923   
 1924       /**
 1925        * Returns a synchronized (thread-safe) map backed by the specified
 1926        * map.  In order to guarantee serial access, it is critical that
 1927        * <strong>all</strong> access to the backing map is accomplished
 1928        * through the returned map.<p>
 1929        *
 1930        * It is imperative that the user manually synchronize on the returned
 1931        * map when iterating over any of its collection views:
 1932        * <pre>
 1933        *  Map m = Collections.synchronizedMap(new HashMap());
 1934        *      ...
 1935        *  Set s = m.keySet();  // Needn't be in synchronized block
 1936        *      ...
 1937        *  synchronized(m) {  // Synchronizing on m, not s!
 1938        *      Iterator i = s.iterator(); // Must be in synchronized block
 1939        *      while (i.hasNext())
 1940        *          foo(i.next());
 1941        *  }
 1942        * </pre>
 1943        * Failure to follow this advice may result in non-deterministic behavior.
 1944        *
 1945        * <p>The returned map will be serializable if the specified map is
 1946        * serializable.
 1947        *
 1948        * @param  m the map to be "wrapped" in a synchronized map.
 1949        * @return a synchronized view of the specified map.
 1950        */
 1951       public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
 1952           return new SynchronizedMap<K,V>(m);
 1953       }
 1954   
 1955       /**
 1956        * @serial include
 1957        */
 1958       private static class SynchronizedMap<K,V>
 1959           implements Map<K,V>, Serializable {
 1960           private static final long serialVersionUID = 1978198479659022715L;
 1961   
 1962           private final Map<K,V> m;     // Backing Map
 1963           final Object      mutex;        // Object on which to synchronize
 1964   
 1965           SynchronizedMap(Map<K,V> m) {
 1966               if (m==null)
 1967                   throw new NullPointerException();
 1968               this.m = m;
 1969               mutex = this;
 1970           }
 1971   
 1972           SynchronizedMap(Map<K,V> m, Object mutex) {
 1973               this.m = m;
 1974               this.mutex = mutex;
 1975           }
 1976   
 1977           public int size() {
 1978               synchronized(mutex) {return m.size();}
 1979           }
 1980           public boolean isEmpty() {
 1981               synchronized(mutex) {return m.isEmpty();}
 1982           }
 1983           public boolean containsKey(Object key) {
 1984               synchronized(mutex) {return m.containsKey(key);}
 1985           }
 1986           public boolean containsValue(Object value) {
 1987               synchronized(mutex) {return m.containsValue(value);}
 1988           }
 1989           public V get(Object key) {
 1990               synchronized(mutex) {return m.get(key);}
 1991           }
 1992   
 1993           public V put(K key, V value) {
 1994               synchronized(mutex) {return m.put(key, value);}
 1995           }
 1996           public V remove(Object key) {
 1997               synchronized(mutex) {return m.remove(key);}
 1998           }
 1999           public void putAll(Map<? extends K, ? extends V> map) {
 2000               synchronized(mutex) {m.putAll(map);}
 2001           }
 2002           public void clear() {
 2003               synchronized(mutex) {m.clear();}
 2004           }
 2005   
 2006           private transient Set<K> keySet = null;
 2007           private transient Set<Map.Entry<K,V>> entrySet = null;
 2008           private transient Collection<V> values = null;
 2009   
 2010           public Set<K> keySet() {
 2011               synchronized(mutex) {
 2012                   if (keySet==null)
 2013                       keySet = new SynchronizedSet<K>(m.keySet(), mutex);
 2014                   return keySet;
 2015               }
 2016           }
 2017   
 2018           public Set<Map.Entry<K,V>> entrySet() {
 2019               synchronized(mutex) {
 2020                   if (entrySet==null)
 2021                       entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);
 2022                   return entrySet;
 2023               }
 2024           }
 2025   
 2026           public Collection<V> values() {
 2027               synchronized(mutex) {
 2028                   if (values==null)
 2029                       values = new SynchronizedCollection<V>(m.values(), mutex);
 2030                   return values;
 2031               }
 2032           }
 2033   
 2034           public boolean equals(Object o) {
 2035               synchronized(mutex) {return m.equals(o);}
 2036           }
 2037           public int hashCode() {
 2038               synchronized(mutex) {return m.hashCode();}
 2039           }
 2040           public String toString() {
 2041               synchronized(mutex) {return m.toString();}
 2042           }
 2043           private void writeObject(ObjectOutputStream s) throws IOException {
 2044               synchronized(mutex) {s.defaultWriteObject();}
 2045           }
 2046       }
 2047   
 2048       /**
 2049        * Returns a synchronized (thread-safe) sorted map backed by the specified
 2050        * sorted map.  In order to guarantee serial access, it is critical that
 2051        * <strong>all</strong> access to the backing sorted map is accomplished
 2052        * through the returned sorted map (or its views).<p>
 2053        *
 2054        * It is imperative that the user manually synchronize on the returned
 2055        * sorted map when iterating over any of its collection views, or the
 2056        * collections views of any of its <tt>subMap</tt>, <tt>headMap</tt> or
 2057        * <tt>tailMap</tt> views.
 2058        * <pre>
 2059        *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
 2060        *      ...
 2061        *  Set s = m.keySet();  // Needn't be in synchronized block
 2062        *      ...
 2063        *  synchronized(m) {  // Synchronizing on m, not s!
 2064        *      Iterator i = s.iterator(); // Must be in synchronized block
 2065        *      while (i.hasNext())
 2066        *          foo(i.next());
 2067        *  }
 2068        * </pre>
 2069        * or:
 2070        * <pre>
 2071        *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
 2072        *  SortedMap m2 = m.subMap(foo, bar);
 2073        *      ...
 2074        *  Set s2 = m2.keySet();  // Needn't be in synchronized block
 2075        *      ...
 2076        *  synchronized(m) {  // Synchronizing on m, not m2 or s2!
 2077        *      Iterator i = s.iterator(); // Must be in synchronized block
 2078        *      while (i.hasNext())
 2079        *          foo(i.next());
 2080        *  }
 2081        * </pre>
 2082        * Failure to follow this advice may result in non-deterministic behavior.
 2083        *
 2084        * <p>The returned sorted map will be serializable if the specified
 2085        * sorted map is serializable.
 2086        *
 2087        * @param  m the sorted map to be "wrapped" in a synchronized sorted map.
 2088        * @return a synchronized view of the specified sorted map.
 2089        */
 2090       public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m) {
 2091           return new SynchronizedSortedMap<K,V>(m);
 2092       }
 2093   
 2094   
 2095       /**
 2096        * @serial include
 2097        */
 2098       static class SynchronizedSortedMap<K,V>
 2099           extends SynchronizedMap<K,V>
 2100           implements SortedMap<K,V>
 2101       {
 2102           private static final long serialVersionUID = -8798146769416483793L;
 2103   
 2104           private final SortedMap<K,V> sm;
 2105   
 2106           SynchronizedSortedMap(SortedMap<K,V> m) {
 2107               super(m);
 2108               sm = m;
 2109           }
 2110           SynchronizedSortedMap(SortedMap<K,V> m, Object mutex) {
 2111               super(m, mutex);
 2112               sm = m;
 2113           }
 2114   
 2115           public Comparator<? super K> comparator() {
 2116               synchronized(mutex) {return sm.comparator();}
 2117           }
 2118   
 2119           public SortedMap<K,V> subMap(K fromKey, K toKey) {
 2120               synchronized(mutex) {
 2121                   return new SynchronizedSortedMap<K,V>(
 2122                       sm.subMap(fromKey, toKey), mutex);
 2123               }
 2124           }
 2125           public SortedMap<K,V> headMap(K toKey) {
 2126               synchronized(mutex) {
 2127                   return new SynchronizedSortedMap<K,V>(sm.headMap(toKey), mutex);
 2128               }
 2129           }
 2130           public SortedMap<K,V> tailMap(K fromKey) {
 2131               synchronized(mutex) {
 2132                  return new SynchronizedSortedMap<K,V>(sm.tailMap(fromKey),mutex);
 2133               }
 2134           }
 2135   
 2136           public K firstKey() {
 2137               synchronized(mutex) {return sm.firstKey();}
 2138           }
 2139           public K lastKey() {
 2140               synchronized(mutex) {return sm.lastKey();}
 2141           }
 2142       }
 2143   
 2144       // Dynamically typesafe collection wrappers
 2145   
 2146       /**
 2147        * Returns a dynamically typesafe view of the specified collection.
 2148        * Any attempt to insert an element of the wrong type will result in an
 2149        * immediate {@link ClassCastException}.  Assuming a collection
 2150        * contains no incorrectly typed elements prior to the time a
 2151        * dynamically typesafe view is generated, and that all subsequent
 2152        * access to the collection takes place through the view, it is
 2153        * <i>guaranteed</i> that the collection cannot contain an incorrectly
 2154        * typed element.
 2155        *
 2156        * <p>The generics mechanism in the language provides compile-time
 2157        * (static) type checking, but it is possible to defeat this mechanism
 2158        * with unchecked casts.  Usually this is not a problem, as the compiler
 2159        * issues warnings on all such unchecked operations.  There are, however,
 2160        * times when static type checking alone is not sufficient.  For example,
 2161        * suppose a collection is passed to a third-party library and it is
 2162        * imperative that the library code not corrupt the collection by
 2163        * inserting an element of the wrong type.
 2164        *
 2165        * <p>Another use of dynamically typesafe views is debugging.  Suppose a
 2166        * program fails with a {@code ClassCastException}, indicating that an
 2167        * incorrectly typed element was put into a parameterized collection.
 2168        * Unfortunately, the exception can occur at any time after the erroneous
 2169        * element is inserted, so it typically provides little or no information
 2170        * as to the real source of the problem.  If the problem is reproducible,
 2171        * one can quickly determine its source by temporarily modifying the
 2172        * program to wrap the collection with a dynamically typesafe view.
 2173        * For example, this declaration:
 2174        *  <pre> {@code
 2175        *     Collection<String> c = new HashSet<String>();
 2176        * }</pre>
 2177        * may be replaced temporarily by this one:
 2178        *  <pre> {@code
 2179        *     Collection<String> c = Collections.checkedCollection(
 2180        *         new HashSet<String>(), String.class);
 2181        * }</pre>
 2182        * Running the program again will cause it to fail at the point where
 2183        * an incorrectly typed element is inserted into the collection, clearly
 2184        * identifying the source of the problem.  Once the problem is fixed, the
 2185        * modified declaration may be reverted back to the original.
 2186        *
 2187        * <p>The returned collection does <i>not</i> pass the hashCode and equals
 2188        * operations through to the backing collection, but relies on
 2189        * {@code Object}'s {@code equals} and {@code hashCode} methods.  This
 2190        * is necessary to preserve the contracts of these operations in the case
 2191        * that the backing collection is a set or a list.
 2192        *
 2193        * <p>The returned collection will be serializable if the specified
 2194        * collection is serializable.
 2195        *
 2196        * <p>Since {@code null} is considered to be a value of any reference
 2197        * type, the returned collection permits insertion of null elements
 2198        * whenever the backing collection does.
 2199        *
 2200        * @param c the collection for which a dynamically typesafe view is to be
 2201        *          returned
 2202        * @param type the type of element that {@code c} is permitted to hold
 2203        * @return a dynamically typesafe view of the specified collection
 2204        * @since 1.5
 2205        */
 2206       public static <E> Collection<E> checkedCollection(Collection<E> c,
 2207                                                         Class<E> type) {
 2208           return new CheckedCollection<E>(c, type);
 2209       }
 2210   
 2211       @SuppressWarnings("unchecked")
 2212       static <T> T[] zeroLengthArray(Class<T> type) {
 2213           return (T[]) Array.newInstance(type, 0);
 2214       }
 2215   
 2216       /**
 2217        * @serial include
 2218        */
 2219       static class CheckedCollection<E> implements Collection<E>, Serializable {
 2220           private static final long serialVersionUID = 1578914078182001775L;
 2221   
 2222           final Collection<E> c;
 2223           final Class<E> type;
 2224   
 2225           void typeCheck(Object o) {
 2226               if (o != null && !type.isInstance(o))
 2227                   throw new ClassCastException(badElementMsg(o));
 2228           }
 2229   
 2230           private String badElementMsg(Object o) {
 2231               return "Attempt to insert " + o.getClass() +
 2232                   " element into collection with element type " + type;
 2233           }
 2234   
 2235           CheckedCollection(Collection<E> c, Class<E> type) {
 2236               if (c==null || type == null)
 2237                   throw new NullPointerException();
 2238               this.c = c;
 2239               this.type = type;
 2240           }
 2241   
 2242           public int size()                 { return c.size(); }
 2243           public boolean isEmpty()          { return c.isEmpty(); }
 2244           public boolean contains(Object o) { return c.contains(o); }
 2245           public Object[] toArray()         { return c.toArray(); }
 2246           public <T> T[] toArray(T[] a)     { return c.toArray(a); }
 2247           public String toString()          { return c.toString(); }
 2248           public boolean remove(Object o)   { return c.remove(o); }
 2249           public void clear()               {        c.clear(); }
 2250   
 2251           public boolean containsAll(Collection<?> coll) {
 2252               return c.containsAll(coll);
 2253           }
 2254           public boolean removeAll(Collection<?> coll) {
 2255               return c.removeAll(coll);
 2256           }
 2257           public boolean retainAll(Collection<?> coll) {
 2258               return c.retainAll(coll);
 2259           }
 2260   
 2261           public Iterator<E> iterator() {
 2262               final Iterator<E> it = c.iterator();
 2263               return new Iterator<E>() {
 2264                   public boolean hasNext() { return it.hasNext(); }
 2265                   public E next()          { return it.next(); }
 2266                   public void remove()     {        it.remove(); }};
 2267           }
 2268   
 2269           public boolean add(E e) {
 2270               typeCheck(e);
 2271               return c.add(e);
 2272           }
 2273   
 2274           private E[] zeroLengthElementArray = null; // Lazily initialized
 2275   
 2276           private E[] zeroLengthElementArray() {
 2277               return zeroLengthElementArray != null ? zeroLengthElementArray :
 2278                   (zeroLengthElementArray = zeroLengthArray(type));
 2279           }
 2280   
 2281           @SuppressWarnings("unchecked")
 2282           Collection<E> checkedCopyOf(Collection<? extends E> coll) {
 2283               Object[] a = null;
 2284               try {
 2285                   E[] z = zeroLengthElementArray();
 2286                   a = coll.toArray(z);
 2287                   // Defend against coll violating the toArray contract
 2288                   if (a.getClass() != z.getClass())
 2289                       a = Arrays.copyOf(a, a.length, z.getClass());
 2290               } catch (ArrayStoreException ignore) {
 2291                   // To get better and consistent diagnostics,
 2292                   // we call typeCheck explicitly on each element.
 2293                   // We call clone() to defend against coll retaining a
 2294                   // reference to the returned array and storing a bad
 2295                   // element into it after it has been type checked.
 2296                   a = coll.toArray().clone();
 2297                   for (Object o : a)
 2298                       typeCheck(o);
 2299               }
 2300               // A slight abuse of the type system, but safe here.
 2301               return (Collection<E>) Arrays.asList(a);
 2302           }
 2303   
 2304           public boolean addAll(Collection<? extends E> coll) {
 2305               // Doing things this way insulates us from concurrent changes
 2306               // in the contents of coll and provides all-or-nothing
 2307               // semantics (which we wouldn't get if we type-checked each
 2308               // element as we added it)
 2309               return c.addAll(checkedCopyOf(coll));
 2310           }
 2311       }
 2312   
 2313       /**
 2314        * Returns a dynamically typesafe view of the specified set.
 2315        * Any attempt to insert an element of the wrong type will result in
 2316        * an immediate {@link ClassCastException}.  Assuming a set contains
 2317        * no incorrectly typed elements prior to the time a dynamically typesafe
 2318        * view is generated, and that all subsequent access to the set
 2319        * takes place through the view, it is <i>guaranteed</i> that the
 2320        * set cannot contain an incorrectly typed element.
 2321        *
 2322        * <p>A discussion of the use of dynamically typesafe views may be
 2323        * found in the documentation for the {@link #checkedCollection
 2324        * checkedCollection} method.
 2325        *
 2326        * <p>The returned set will be serializable if the specified set is
 2327        * serializable.
 2328        *
 2329        * <p>Since {@code null} is considered to be a value of any reference
 2330        * type, the returned set permits insertion of null elements whenever
 2331        * the backing set does.
 2332        *
 2333        * @param s the set for which a dynamically typesafe view is to be
 2334        *          returned
 2335        * @param type the type of element that {@code s} is permitted to hold
 2336        * @return a dynamically typesafe view of the specified set
 2337        * @since 1.5
 2338        */
 2339       public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
 2340           return new CheckedSet<E>(s, type);
 2341       }
 2342   
 2343       /**
 2344        * @serial include
 2345        */
 2346       static class CheckedSet<E> extends CheckedCollection<E>
 2347                                    implements Set<E>, Serializable
 2348       {
 2349           private static final long serialVersionUID = 4694047833775013803L;
 2350   
 2351           CheckedSet(Set<E> s, Class<E> elementType) { super(s, elementType); }
 2352   
 2353           public boolean equals(Object o) { return o == this || c.equals(o); }
 2354           public int hashCode()           { return c.hashCode(); }
 2355       }
 2356   
 2357       /**
 2358        * Returns a dynamically typesafe view of the specified sorted set.
 2359        * Any attempt to insert an element of the wrong type will result in an
 2360        * immediate {@link ClassCastException}.  Assuming a sorted set
 2361        * contains no incorrectly typed elements prior to the time a
 2362        * dynamically typesafe view is generated, and that all subsequent
 2363        * access to the sorted set takes place through the view, it is
 2364        * <i>guaranteed</i> that the sorted set cannot contain an incorrectly
 2365        * typed element.
 2366        *
 2367        * <p>A discussion of the use of dynamically typesafe views may be
 2368        * found in the documentation for the {@link #checkedCollection
 2369        * checkedCollection} method.
 2370        *
 2371        * <p>The returned sorted set will be serializable if the specified sorted
 2372        * set is serializable.
 2373        *
 2374        * <p>Since {@code null} is considered to be a value of any reference
 2375        * type, the returned sorted set permits insertion of null elements
 2376        * whenever the backing sorted set does.
 2377        *
 2378        * @param s the sorted set for which a dynamically typesafe view is to be
 2379        *          returned
 2380        * @param type the type of element that {@code s} is permitted to hold
 2381        * @return a dynamically typesafe view of the specified sorted set
 2382        * @since 1.5
 2383        */
 2384       public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
 2385                                                       Class<E> type) {
 2386           return new CheckedSortedSet<E>(s, type);
 2387       }
 2388   
 2389       /**
 2390        * @serial include
 2391        */
 2392       static class CheckedSortedSet<E> extends CheckedSet<E>
 2393           implements SortedSet<E>, Serializable
 2394       {
 2395           private static final long serialVersionUID = 1599911165492914959L;
 2396           private final SortedSet<E> ss;
 2397   
 2398           CheckedSortedSet(SortedSet<E> s, Class<E> type) {
 2399               super(s, type);
 2400               ss = s;
 2401           }
 2402   
 2403           public Comparator<? super E> comparator() { return ss.comparator(); }
 2404           public E first()                   { return ss.first(); }
 2405           public E last()                    { return ss.last(); }
 2406   
 2407           public SortedSet<E> subSet(E fromElement, E toElement) {
 2408               return checkedSortedSet(ss.subSet(fromElement,toElement), type);
 2409           }
 2410           public SortedSet<E> headSet(E toElement) {
 2411               return checkedSortedSet(ss.headSet(toElement), type);
 2412           }
 2413           public SortedSet<E> tailSet(E fromElement) {
 2414               return checkedSortedSet(ss.tailSet(fromElement), type);
 2415           }
 2416       }
 2417   
 2418       /**
 2419        * Returns a dynamically typesafe view of the specified list.
 2420        * Any attempt to insert an element of the wrong type will result in
 2421        * an immediate {@link ClassCastException}.  Assuming a list contains
 2422        * no incorrectly typed elements prior to the time a dynamically typesafe
 2423        * view is generated, and that all subsequent access to the list
 2424        * takes place through the view, it is <i>guaranteed</i> that the
 2425        * list cannot contain an incorrectly typed element.
 2426        *
 2427        * <p>A discussion of the use of dynamically typesafe views may be
 2428        * found in the documentation for the {@link #checkedCollection
 2429        * checkedCollection} method.
 2430        *
 2431        * <p>The returned list will be serializable if the specified list
 2432        * is serializable.
 2433        *
 2434        * <p>Since {@code null} is considered to be a value of any reference
 2435        * type, the returned list permits insertion of null elements whenever
 2436        * the backing list does.
 2437        *
 2438        * @param list the list for which a dynamically typesafe view is to be
 2439        *             returned
 2440        * @param type the type of element that {@code list} is permitted to hold
 2441        * @return a dynamically typesafe view of the specified list
 2442        * @since 1.5
 2443        */
 2444       public static <E> List<E> checkedList(List<E> list, Class<E> type) {
 2445           return (list instanceof RandomAccess ?
 2446                   new CheckedRandomAccessList<E>(list, type) :
 2447                   new CheckedList<E>(list, type));
 2448       }
 2449   
 2450       /**
 2451        * @serial include
 2452        */
 2453       static class CheckedList<E>
 2454           extends CheckedCollection<E>
 2455           implements List<E>
 2456       {
 2457           private static final long serialVersionUID = 65247728283967356L;
 2458           final List<E> list;
 2459   
 2460           CheckedList(List<E> list, Class<E> type) {
 2461               super(list, type);
 2462               this.list = list;
 2463           }
 2464   
 2465           public boolean equals(Object o)  { return o == this || list.equals(o); }
 2466           public int hashCode()            { return list.hashCode(); }
 2467           public E get(int index)          { return list.get(index); }
 2468           public E remove(int index)       { return list.remove(index); }
 2469           public int indexOf(Object o)     { return list.indexOf(o); }
 2470           public int lastIndexOf(Object o) { return list.lastIndexOf(o); }
 2471   
 2472           public E set(int index, E element) {
 2473               typeCheck(element);
 2474               return list.set(index, element);
 2475           }
 2476   
 2477           public void add(int index, E element) {
 2478               typeCheck(element);
 2479               list.add(index, element);
 2480           }
 2481   
 2482           public boolean addAll(int index, Collection<? extends E> c) {
 2483               return list.addAll(index, checkedCopyOf(c));
 2484           }
 2485           public ListIterator<E> listIterator()   { return listIterator(0); }
 2486   
 2487           public ListIterator<E> listIterator(final int index) {
 2488               final ListIterator<E> i = list.listIterator(index);
 2489   
 2490               return new ListIterator<E>() {
 2491                   public boolean hasNext()     { return i.hasNext(); }
 2492                   public E next()              { return i.next(); }
 2493                   public boolean hasPrevious() { return i.hasPrevious(); }
 2494                   public E previous()          { return i.previous(); }
 2495                   public int nextIndex()       { return i.nextIndex(); }
 2496                   public int previousIndex()   { return i.previousIndex(); }
 2497                   public void remove()         {        i.remove(); }
 2498   
 2499                   public void set(E e) {
 2500                       typeCheck(e);
 2501                       i.set(e);
 2502                   }
 2503   
 2504                   public void add(E e) {
 2505                       typeCheck(e);
 2506                       i.add(e);
 2507                   }
 2508               };
 2509           }
 2510   
 2511           public List<E> subList(int fromIndex, int toIndex) {
 2512               return new CheckedList<E>(list.subList(fromIndex, toIndex), type);
 2513           }
 2514       }
 2515   
 2516       /**
 2517        * @serial include
 2518        */
 2519       static class CheckedRandomAccessList<E> extends CheckedList<E>
 2520                                               implements RandomAccess
 2521       {
 2522           private static final long serialVersionUID = 1638200125423088369L;
 2523   
 2524           CheckedRandomAccessList(List<E> list, Class<E> type) {
 2525               super(list, type);
 2526           }
 2527   
 2528           public List<E> subList(int fromIndex, int toIndex) {
 2529               return new CheckedRandomAccessList<E>(
 2530                   list.subList(fromIndex, toIndex), type);
 2531           }
 2532       }
 2533   
 2534       /**
 2535        * Returns a dynamically typesafe view of the specified map.
 2536        * Any attempt to insert a mapping whose key or value have the wrong
 2537        * type will result in an immediate {@link ClassCastException}.
 2538        * Similarly, any attempt to modify the value currently associated with
 2539        * a key will result in an immediate {@link ClassCastException},
 2540        * whether the modification is attempted directly through the map
 2541        * itself, or through a {@link Map.Entry} instance obtained from the
 2542        * map's {@link Map#entrySet() entry set} view.
 2543        *
 2544        * <p>Assuming a map contains no incorrectly typed keys or values
 2545        * prior to the time a dynamically typesafe view is generated, and
 2546        * that all subsequent access to the map takes place through the view
 2547        * (or one of its collection views), it is <i>guaranteed</i> that the
 2548        * map cannot contain an incorrectly typed key or value.
 2549        *
 2550        * <p>A discussion of the use of dynamically typesafe views may be
 2551        * found in the documentation for the {@link #checkedCollection
 2552        * checkedCollection} method.
 2553        *
 2554        * <p>The returned map will be serializable if the specified map is
 2555        * serializable.
 2556        *
 2557        * <p>Since {@code null} is considered to be a value of any reference
 2558        * type, the returned map permits insertion of null keys or values
 2559        * whenever the backing map does.
 2560        *
 2561        * @param m the map for which a dynamically typesafe view is to be
 2562        *          returned
 2563        * @param keyType the type of key that {@code m} is permitted to hold
 2564        * @param valueType the type of value that {@code m} is permitted to hold
 2565        * @return a dynamically typesafe view of the specified map
 2566        * @since 1.5
 2567        */
 2568       public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
 2569                                                 Class<K> keyType,
 2570                                                 Class<V> valueType) {
 2571           return new CheckedMap<K,V>(m, keyType, valueType);
 2572       }
 2573   
 2574   
 2575       /**
 2576        * @serial include
 2577        */
 2578       private static class CheckedMap<K,V>
 2579           implements Map<K,V>, Serializable
 2580       {
 2581           private static final long serialVersionUID = 5742860141034234728L;
 2582   
 2583           private final Map<K, V> m;
 2584           final Class<K> keyType;
 2585           final Class<V> valueType;
 2586   
 2587           private void typeCheck(Object key, Object value) {
 2588               if (key != null && !keyType.isInstance(key))
 2589                   throw new ClassCastException(badKeyMsg(key));
 2590   
 2591               if (value != null && !valueType.isInstance(value))
 2592                   throw new ClassCastException(badValueMsg(value));
 2593           }
 2594   
 2595           private String badKeyMsg(Object key) {
 2596               return "Attempt to insert " + key.getClass() +
 2597                   " key into map with key type " + keyType;
 2598           }
 2599   
 2600           private String badValueMsg(Object value) {
 2601               return "Attempt to insert " + value.getClass() +
 2602                   " value into map with value type " + valueType;
 2603           }
 2604   
 2605           CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) {
 2606               if (m == null || keyType == null || valueType == null)
 2607                   throw new NullPointerException();
 2608               this.m = m;
 2609               this.keyType = keyType;
 2610               this.valueType = valueType;
 2611           }
 2612   
 2613           public int size()                      { return m.size(); }
 2614           public boolean isEmpty()               { return m.isEmpty(); }
 2615           public boolean containsKey(Object key) { return m.containsKey(key); }
 2616           public boolean containsValue(Object v) { return m.containsValue(v); }
 2617           public V get(Object key)               { return m.get(key); }
 2618           public V remove(Object key)            { return m.remove(key); }
 2619           public void clear()                    { m.clear(); }
 2620           public Set<K> keySet()                 { return m.keySet(); }
 2621           public Collection<V> values()          { return m.values(); }
 2622           public boolean equals(Object o)        { return o == this || m.equals(o); }
 2623           public int hashCode()                  { return m.hashCode(); }
 2624           public String toString()               { return m.toString(); }
 2625   
 2626           public V put(K key, V value) {
 2627               typeCheck(key, value);
 2628               return m.put(key, value);
 2629           }
 2630   
 2631           @SuppressWarnings("unchecked")
 2632           public void putAll(Map<? extends K, ? extends V> t) {
 2633               // Satisfy the following goals:
 2634               // - good diagnostics in case of type mismatch
 2635               // - all-or-nothing semantics
 2636               // - protection from malicious t
 2637               // - correct behavior if t is a concurrent map
 2638               Object[] entries = t.entrySet().toArray();
 2639               List<Map.Entry<K,V>> checked =
 2640                   new ArrayList<Map.Entry<K,V>>(entries.length);
 2641               for (Object o : entries) {
 2642                   Map.Entry<?,?> e = (Map.Entry<?,?>) o;
 2643                   Object k = e.getKey();
 2644                   Object v = e.getValue();
 2645                   typeCheck(k, v);
 2646                   checked.add(
 2647                       new AbstractMap.SimpleImmutableEntry<K,V>((K) k, (V) v));
 2648               }
 2649               for (Map.Entry<K,V> e : checked)
 2650                   m.put(e.getKey(), e.getValue());
 2651           }
 2652   
 2653           private transient Set<Map.Entry<K,V>> entrySet = null;
 2654   
 2655           public Set<Map.Entry<K,V>> entrySet() {
 2656               if (entrySet==null)
 2657                   entrySet = new CheckedEntrySet<K,V>(m.entrySet(), valueType);
 2658               return entrySet;
 2659           }
 2660   
 2661           /**
 2662            * We need this class in addition to CheckedSet as Map.Entry permits
 2663            * modification of the backing Map via the setValue operation.  This
 2664            * class is subtle: there are many possible attacks that must be
 2665            * thwarted.
 2666            *
 2667            * @serial exclude
 2668            */
 2669           static class CheckedEntrySet<K,V> implements Set<Map.Entry<K,V>> {
 2670               private final Set<Map.Entry<K,V>> s;
 2671               private final Class<V> valueType;
 2672   
 2673               CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) {
 2674                   this.s = s;
 2675                   this.valueType = valueType;
 2676               }
 2677   
 2678               public int size()        { return s.size(); }
 2679               public boolean isEmpty() { return s.isEmpty(); }
 2680               public String toString() { return s.toString(); }
 2681               public int hashCode()    { return s.hashCode(); }
 2682               public void clear()      {        s.clear(); }
 2683   
 2684               public boolean add(Map.Entry<K, V> e) {
 2685                   throw new UnsupportedOperationException();
 2686               }
 2687               public boolean addAll(Collection<? extends Map.Entry<K, V>> coll) {
 2688                   throw new UnsupportedOperationException();
 2689               }
 2690   
 2691               public Iterator<Map.Entry<K,V>> iterator() {
 2692                   final Iterator<Map.Entry<K, V>> i = s.iterator();
 2693                   final Class<V> valueType = this.valueType;
 2694   
 2695                   return new Iterator<Map.Entry<K,V>>() {
 2696                       public boolean hasNext() { return i.hasNext(); }
 2697                       public void remove()     { i.remove(); }
 2698   
 2699                       public Map.Entry<K,V> next() {
 2700                           return checkedEntry(i.next(), valueType);
 2701                       }
 2702                   };
 2703               }
 2704   
 2705               @SuppressWarnings("unchecked")
 2706               public Object[] toArray() {
 2707                   Object[] source = s.toArray();
 2708   
 2709                   /*
 2710                    * Ensure that we don't get an ArrayStoreException even if
 2711                    * s.toArray returns an array of something other than Object
 2712                    */
 2713                   Object[] dest = (CheckedEntry.class.isInstance(
 2714                       source.getClass().getComponentType()) ? source :
 2715                                    new Object[source.length]);
 2716   
 2717                   for (int i = 0; i < source.length; i++)
 2718                       dest[i] = checkedEntry((Map.Entry<K,V>)source[i],
 2719                                              valueType);
 2720                   return dest;
 2721               }
 2722   
 2723               @SuppressWarnings("unchecked")
 2724               public <T> T[] toArray(T[] a) {
 2725                   // We don't pass a to s.toArray, to avoid window of
 2726                   // vulnerability wherein an unscrupulous multithreaded client
 2727                   // could get his hands on raw (unwrapped) Entries from s.
 2728                   T[] arr = s.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
 2729   
 2730                   for (int i=0; i<arr.length; i++)
 2731                       arr[i] = (T) checkedEntry((Map.Entry<K,V>)arr[i],
 2732                                                 valueType);
 2733                   if (arr.length > a.length)
 2734                       return arr;
 2735   
 2736                   System.arraycopy(arr, 0, a, 0, arr.length);
 2737                   if (a.length > arr.length)
 2738                       a[arr.length] = null;
 2739                   return a;
 2740               }
 2741   
 2742               /**
 2743                * This method is overridden to protect the backing set against
 2744                * an object with a nefarious equals function that senses
 2745                * that the equality-candidate is Map.Entry and calls its
 2746                * setValue method.
 2747                */
 2748               public boolean contains(Object o) {
 2749                   if (!(o instanceof Map.Entry))
 2750                       return false;
 2751                   Map.Entry<?,?> e = (Map.Entry<?,?>) o;
 2752                   return s.contains(
 2753                       (e instanceof CheckedEntry) ? e : checkedEntry(e, valueType));
 2754               }
 2755   
 2756               /**
 2757                * The bulk collection methods are overridden to protect
 2758                * against an unscrupulous collection whose contains(Object o)
 2759                * method senses when o is a Map.Entry, and calls o.setValue.
 2760                */
 2761               public boolean containsAll(Collection<?> c) {
 2762                   for (Object o : c)
 2763                       if (!contains(o)) // Invokes safe contains() above
 2764                           return false;
 2765                   return true;
 2766               }
 2767   
 2768               public boolean remove(Object o) {
 2769                   if (!(o instanceof Map.Entry))
 2770                       return false;
 2771                   return s.remove(new AbstractMap.SimpleImmutableEntry
 2772                                   <Object, Object>((Map.Entry<?,?>)o));
 2773               }
 2774   
 2775               public boolean removeAll(Collection<?> c) {
 2776                   return batchRemove(c, false);
 2777               }
 2778               public boolean retainAll(Collection<?> c) {
 2779                   return batchRemove(c, true);
 2780               }
 2781               private boolean batchRemove(Collection<?> c, boolean complement) {
 2782                   boolean modified = false;
 2783                   Iterator<Map.Entry<K,V>> it = iterator();
 2784                   while (it.hasNext()) {
 2785                       if (c.contains(it.next()) != complement) {
 2786                           it.remove();
 2787                           modified = true;
 2788                       }
 2789                   }
 2790                   return modified;
 2791               }
 2792   
 2793               public boolean equals(Object o) {
 2794                   if (o == this)
 2795                       return true;
 2796                   if (!(o instanceof Set))
 2797                       return false;
 2798                   Set<?> that = (Set<?>) o;
 2799                   return that.size() == s.size()
 2800                       && containsAll(that); // Invokes safe containsAll() above
 2801               }
 2802   
 2803               static <K,V,T> CheckedEntry<K,V,T> checkedEntry(Map.Entry<K,V> e,
 2804                                                               Class<T> valueType) {
 2805                   return new CheckedEntry<K,V,T>(e, valueType);
 2806               }
 2807   
 2808               /**
 2809                * This "wrapper class" serves two purposes: it prevents
 2810                * the client from modifying the backing Map, by short-circuiting
 2811                * the setValue method, and it protects the backing Map against
 2812                * an ill-behaved Map.Entry that attempts to modify another
 2813                * Map.Entry when asked to perform an equality check.
 2814                */
 2815               private static class CheckedEntry<K,V,T> implements Map.Entry<K,V> {
 2816                   private final Map.Entry<K, V> e;
 2817                   private final Class<T> valueType;
 2818   
 2819                   CheckedEntry(Map.Entry<K, V> e, Class<T> valueType) {
 2820                       this.e = e;
 2821                       this.valueType = valueType;
 2822                   }
 2823   
 2824                   public K getKey()        { return e.getKey(); }
 2825                   public V getValue()      { return e.getValue(); }
 2826                   public int hashCode()    { return e.hashCode(); }
 2827                   public String toString() { return e.toString(); }
 2828   
 2829                   public V setValue(V value) {
 2830                       if (value != null && !valueType.isInstance(value))
 2831                           throw new ClassCastException(badValueMsg(value));
 2832                       return e.setValue(value);
 2833                   }
 2834   
 2835                   private String badValueMsg(Object value) {
 2836                       return "Attempt to insert " + value.getClass() +
 2837                           " value into map with value type " + valueType;
 2838                   }
 2839   
 2840                   public boolean equals(Object o) {
 2841                       if (o == this)
 2842                           return true;
 2843                       if (!(o instanceof Map.Entry))
 2844                           return false;
 2845                       return e.equals(new AbstractMap.SimpleImmutableEntry
 2846                                       <Object, Object>((Map.Entry<?,?>)o));
 2847                   }
 2848               }
 2849           }
 2850       }
 2851   
 2852       /**
 2853        * Returns a dynamically typesafe view of the specified sorted map.
 2854        * Any attempt to insert a mapping whose key or value have the wrong
 2855        * type will result in an immediate {@link ClassCastException}.
 2856        * Similarly, any attempt to modify the value currently associated with
 2857        * a key will result in an immediate {@link ClassCastException},
 2858        * whether the modification is attempted directly through the map
 2859        * itself, or through a {@link Map.Entry} instance obtained from the
 2860        * map's {@link Map#entrySet() entry set} view.
 2861        *
 2862        * <p>Assuming a map contains no incorrectly typed keys or values
 2863        * prior to the time a dynamically typesafe view is generated, and
 2864        * that all subsequent access to the map takes place through the view
 2865        * (or one of its collection views), it is <i>guaranteed</i> that the
 2866        * map cannot contain an incorrectly typed key or value.
 2867        *
 2868        * <p>A discussion of the use of dynamically typesafe views may be
 2869        * found in the documentation for the {@link #checkedCollection
 2870        * checkedCollection} method.
 2871        *
 2872        * <p>The returned map will be serializable if the specified map is
 2873        * serializable.
 2874        *
 2875        * <p>Since {@code null} is considered to be a value of any reference
 2876        * type, the returned map permits insertion of null keys or values
 2877        * whenever the backing map does.
 2878        *
 2879        * @param m the map for which a dynamically typesafe view is to be
 2880        *          returned
 2881        * @param keyType the type of key that {@code m} is permitted to hold
 2882        * @param valueType the type of value that {@code m} is permitted to hold
 2883        * @return a dynamically typesafe view of the specified map
 2884        * @since 1.5
 2885        */
 2886       public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m,
 2887                                                           Class<K> keyType,
 2888                                                           Class<V> valueType) {
 2889           return new CheckedSortedMap<K,V>(m, keyType, valueType);
 2890       }
 2891   
 2892       /**
 2893        * @serial include
 2894        */
 2895       static class CheckedSortedMap<K,V> extends CheckedMap<K,V>
 2896           implements SortedMap<K,V>, Serializable
 2897       {
 2898           private static final long serialVersionUID = 1599671320688067438L;
 2899   
 2900           private final SortedMap<K, V> sm;
 2901   
 2902           CheckedSortedMap(SortedMap<K, V> m,
 2903                            Class<K> keyType, Class<V> valueType) {
 2904               super(m, keyType, valueType);
 2905               sm = m;
 2906           }
 2907   
 2908           public Comparator<? super K> comparator() { return sm.comparator(); }
 2909           public K firstKey()                       { return sm.firstKey(); }
 2910           public K lastKey()                        { return sm.lastKey(); }
 2911   
 2912           public SortedMap<K,V> subMap(K fromKey, K toKey) {
 2913               return checkedSortedMap(sm.subMap(fromKey, toKey),
 2914                                       keyType, valueType);
 2915           }
 2916           public SortedMap<K,V> headMap(K toKey) {
 2917               return checkedSortedMap(sm.headMap(toKey), keyType, valueType);
 2918           }
 2919           public SortedMap<K,V> tailMap(K fromKey) {
 2920               return checkedSortedMap(sm.tailMap(fromKey), keyType, valueType);
 2921           }
 2922       }
 2923   
 2924       // Empty collections
 2925   
 2926       /**
 2927        * Returns an iterator that has no elements.  More precisely,
 2928        *
 2929        * <ul compact>
 2930        *
 2931        * <li>{@link Iterator#hasNext hasNext} always returns {@code
 2932        * false}.
 2933        *
 2934        * <li>{@link Iterator#next next} always throws {@link
 2935        * NoSuchElementException}.
 2936        *
 2937        * <li>{@link Iterator#remove remove} always throws {@link
 2938        * IllegalStateException}.
 2939        *
 2940        * </ul>
 2941        *
 2942        * <p>Implementations of this method are permitted, but not
 2943        * required, to return the same object from multiple invocations.
 2944        *
 2945        * @return an empty iterator
 2946        * @since 1.7
 2947        */
 2948       @SuppressWarnings("unchecked")
 2949       public static <T> Iterator<T> emptyIterator() {
 2950           return (Iterator<T>) EmptyIterator.EMPTY_ITERATOR;
 2951       }
 2952   
 2953       private static class EmptyIterator<E> implements Iterator<E> {
 2954           static final EmptyIterator<Object> EMPTY_ITERATOR
 2955               = new EmptyIterator<Object>();
 2956   
 2957           public boolean hasNext() { return false; }
 2958           public E next() { throw new NoSuchElementException(); }
 2959           public void remove() { throw new IllegalStateException(); }
 2960       }
 2961   
 2962       /**
 2963        * Returns a list iterator that has no elements.  More precisely,
 2964        *
 2965        * <ul compact>
 2966        *
 2967        * <li>{@link Iterator#hasNext hasNext} and {@link
 2968        * ListIterator#hasPrevious hasPrevious} always return {@code
 2969        * false}.
 2970        *
 2971        * <li>{@link Iterator#next next} and {@link ListIterator#previous
 2972        * previous} always throw {@link NoSuchElementException}.
 2973        *
 2974        * <li>{@link Iterator#remove remove} and {@link ListIterator#set
 2975        * set} always throw {@link IllegalStateException}.
 2976        *
 2977        * <li>{@link ListIterator#add add} always throws {@link
 2978        * UnsupportedOperationException}.
 2979        *
 2980        * <li>{@link ListIterator#nextIndex nextIndex} always returns
 2981        * {@code 0} .
 2982        *
 2983        * <li>{@link ListIterator#previousIndex previousIndex} always
 2984        * returns {@code -1}.
 2985        *
 2986        * </ul>
 2987        *
 2988        * <p>Implementations of this method are permitted, but not
 2989        * required, to return the same object from multiple invocations.
 2990        *
 2991        * @return an empty list iterator
 2992        * @since 1.7
 2993        */
 2994       @SuppressWarnings("unchecked")
 2995       public static <T> ListIterator<T> emptyListIterator() {
 2996           return (ListIterator<T>) EmptyListIterator.EMPTY_ITERATOR;
 2997       }
 2998   
 2999       private static class EmptyListIterator<E>
 3000           extends EmptyIterator<E>
 3001           implements ListIterator<E>
 3002       {
 3003           static final EmptyListIterator<Object> EMPTY_ITERATOR
 3004               = new EmptyListIterator<Object>();
 3005   
 3006           public boolean hasPrevious() { return false; }
 3007           public E previous() { throw new NoSuchElementException(); }
 3008           public int nextIndex()     { return 0; }
 3009           public int previousIndex() { return -1; }
 3010           public void set(E e) { throw new IllegalStateException(); }
 3011           public void add(E e) { throw new UnsupportedOperationException(); }
 3012       }
 3013   
 3014       /**
 3015        * Returns an enumeration that has no elements.  More precisely,
 3016        *
 3017        * <ul compact>
 3018        *
 3019        * <li>{@link Enumeration#hasMoreElements hasMoreElements} always
 3020        * returns {@code false}.
 3021        *
 3022        * <li> {@link Enumeration#nextElement nextElement} always throws
 3023        * {@link NoSuchElementException}.
 3024        *
 3025        * </ul>
 3026        *
 3027        * <p>Implementations of this method are permitted, but not
 3028        * required, to return the same object from multiple invocations.
 3029        *
 3030        * @return an empty enumeration
 3031        * @since 1.7
 3032        */
 3033       @SuppressWarnings("unchecked")
 3034       public static <T> Enumeration<T> emptyEnumeration() {
 3035           return (Enumeration<T>) EmptyEnumeration.EMPTY_ENUMERATION;
 3036       }
 3037   
 3038       private static class EmptyEnumeration<E> implements Enumeration<E> {
 3039           static final EmptyEnumeration<Object> EMPTY_ENUMERATION
 3040               = new EmptyEnumeration<Object>();
 3041   
 3042           public boolean hasMoreElements() { return false; }
 3043           public E nextElement() { throw new NoSuchElementException(); }
 3044       }
 3045   
 3046       /**
 3047        * The empty set (immutable).  This set is serializable.
 3048        *
 3049        * @see #emptySet()
 3050        */
 3051       @SuppressWarnings("unchecked")
 3052       public static final Set EMPTY_SET = new EmptySet<Object>();
 3053   
 3054       /**
 3055        * Returns the empty set (immutable).  This set is serializable.
 3056        * Unlike the like-named field, this method is parameterized.
 3057        *
 3058        * <p>This example illustrates the type-safe way to obtain an empty set:
 3059        * <pre>
 3060        *     Set&lt;String&gt; s = Collections.emptySet();
 3061        * </pre>
 3062        * Implementation note:  Implementations of this method need not
 3063        * create a separate <tt>Set</tt> object for each call.   Using this
 3064        * method is likely to have comparable cost to using the like-named
 3065        * field.  (Unlike this method, the field does not provide type safety.)
 3066        *
 3067        * @see #EMPTY_SET
 3068        * @since 1.5
 3069        */
 3070       @SuppressWarnings("unchecked")
 3071       public static final <T> Set<T> emptySet() {
 3072           return (Set<T>) EMPTY_SET;
 3073       }
 3074   
 3075       /**
 3076        * @serial include
 3077        */
 3078       private static class EmptySet<E>
 3079           extends AbstractSet<E>
 3080           implements Serializable
 3081       {
 3082           private static final long serialVersionUID = 1582296315990362920L;
 3083   
 3084           public Iterator<E> iterator() { return emptyIterator(); }
 3085   
 3086           public int size() {return 0;}
 3087           public boolean isEmpty() {return true;}
 3088   
 3089           public boolean contains(Object obj) {return false;}
 3090           public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
 3091   
 3092           public Object[] toArray() { return new Object[0]; }
 3093   
 3094           public <T> T[] toArray(T[] a) {
 3095               if (a.length > 0)
 3096                   a[0] = null;
 3097               return a;
 3098           }
 3099   
 3100           // Preserves singleton property
 3101           private Object readResolve() {
 3102               return EMPTY_SET;
 3103           }
 3104       }
 3105   
 3106       /**
 3107        * The empty list (immutable).  This list is serializable.
 3108        *
 3109        * @see #emptyList()
 3110        */
 3111       @SuppressWarnings("unchecked")
 3112       public static final List EMPTY_LIST = new EmptyList<Object>();
 3113   
 3114       /**
 3115        * Returns the empty list (immutable).  This list is serializable.
 3116        *
 3117        * <p>This example illustrates the type-safe way to obtain an empty list:
 3118        * <pre>
 3119        *     List&lt;String&gt; s = Collections.emptyList();
 3120        * </pre>
 3121        * Implementation note:  Implementations of this method need not
 3122        * create a separate <tt>List</tt> object for each call.   Using this
 3123        * method is likely to have comparable cost to using the like-named
 3124        * field.  (Unlike this method, the field does not provide type safety.)
 3125        *
 3126        * @see #EMPTY_LIST
 3127        * @since 1.5
 3128        */
 3129       @SuppressWarnings("unchecked")
 3130       public static final <T> List<T> emptyList() {
 3131           return (List<T>) EMPTY_LIST;
 3132       }
 3133   
 3134       /**
 3135        * @serial include
 3136        */
 3137       private static class EmptyList<E>
 3138           extends AbstractList<E>
 3139           implements RandomAccess, Serializable {
 3140           private static final long serialVersionUID = 8842843931221139166L;
 3141   
 3142           public Iterator<E> iterator() {
 3143               return emptyIterator();
 3144           }
 3145           public ListIterator<E> listIterator() {
 3146               return emptyListIterator();
 3147           }
 3148   
 3149           public int size() {return 0;}
 3150           public boolean isEmpty() {return true;}
 3151   
 3152           public boolean contains(Object obj) {return false;}
 3153           public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
 3154   
 3155           public Object[] toArray() { return new Object[0]; }
 3156   
 3157           public <T> T[] toArray(T[] a) {
 3158               if (a.length > 0)
 3159                   a[0] = null;
 3160               return a;
 3161           }
 3162   
 3163           public E get(int index) {
 3164               throw new IndexOutOfBoundsException("Index: "+index);
 3165           }
 3166   
 3167           public boolean equals(Object o) {
 3168               return (o instanceof List) && ((List<?>)o).isEmpty();
 3169           }
 3170   
 3171           public int hashCode() { return 1; }
 3172   
 3173           // Preserves singleton property
 3174           private Object readResolve() {
 3175               return EMPTY_LIST;
 3176           }
 3177       }
 3178   
 3179       /**
 3180        * The empty map (immutable).  This map is serializable.
 3181        *
 3182        * @see #emptyMap()
 3183        * @since 1.3
 3184        */
 3185       @SuppressWarnings("unchecked")
 3186       public static final Map EMPTY_MAP = new EmptyMap<Object,Object>();
 3187   
 3188       /**
 3189        * Returns the empty map (immutable).  This map is serializable.
 3190        *
 3191        * <p>This example illustrates the type-safe way to obtain an empty set:
 3192        * <pre>
 3193        *     Map&lt;String, Date&gt; s = Collections.emptyMap();
 3194        * </pre>
 3195        * Implementation note:  Implementations of this method need not
 3196        * create a separate <tt>Map</tt> object for each call.   Using this
 3197        * method is likely to have comparable cost to using the like-named
 3198        * field.  (Unlike this method, the field does not provide type safety.)
 3199        *
 3200        * @see #EMPTY_MAP
 3201        * @since 1.5
 3202        */
 3203       @SuppressWarnings("unchecked")
 3204       public static final <K,V> Map<K,V> emptyMap() {
 3205           return (Map<K,V>) EMPTY_MAP;
 3206       }
 3207   
 3208       /**
 3209        * @serial include
 3210        */
 3211       private static class EmptyMap<K,V>
 3212           extends AbstractMap<K,V>
 3213           implements Serializable
 3214       {
 3215           private static final long serialVersionUID = 6428348081105594320L;
 3216   
 3217           public int size()                          {return 0;}
 3218           public boolean isEmpty()                   {return true;}
 3219           public boolean containsKey(Object key)     {return false;}
 3220           public boolean containsValue(Object value) {return false;}
 3221           public V get(Object key)                   {return null;}
 3222           public Set<K> keySet()                     {return emptySet();}
 3223           public Collection<V> values()              {return emptySet();}
 3224           public Set<Map.Entry<K,V>> entrySet()      {return emptySet();}
 3225   
 3226           public boolean equals(Object o) {
 3227               return (o instanceof Map) && ((Map<?,?>)o).isEmpty();
 3228           }
 3229   
 3230           public int hashCode()                      {return 0;}
 3231   
 3232           // Preserves singleton property
 3233           private Object readResolve() {
 3234               return EMPTY_MAP;
 3235           }
 3236       }
 3237   
 3238       // Singleton collections
 3239   
 3240       /**
 3241        * Returns an immutable set containing only the specified object.
 3242        * The returned set is serializable.
 3243        *
 3244        * @param o the sole object to be stored in the returned set.
 3245        * @return an immutable set containing only the specified object.
 3246        */
 3247       public static <T> Set<T> singleton(T o) {
 3248           return new SingletonSet<T>(o);
 3249       }
 3250   
 3251       static <E> Iterator<E> singletonIterator(final E e) {
 3252           return new Iterator<E>() {
 3253               private boolean hasNext = true;
 3254               public boolean hasNext() {
 3255                   return hasNext;
 3256               }
 3257               public E next() {
 3258                   if (hasNext) {
 3259                       hasNext = false;
 3260                       return e;
 3261                   }
 3262                   throw new NoSuchElementException();
 3263               }
 3264               public void remove() {
 3265                   throw new UnsupportedOperationException();
 3266               }
 3267           };
 3268       }
 3269   
 3270       /**
 3271        * @serial include
 3272        */
 3273       private static class SingletonSet<E>
 3274           extends AbstractSet<E>
 3275           implements Serializable
 3276       {
 3277           private static final long serialVersionUID = 3193687207550431679L;
 3278   
 3279           final private E element;
 3280   
 3281           SingletonSet(E e) {element = e;}
 3282   
 3283           public Iterator<E> iterator() {
 3284               return singletonIterator(element);
 3285           }
 3286   
 3287           public int size() {return 1;}
 3288   
 3289           public boolean contains(Object o) {return eq(o, element);}
 3290       }
 3291   
 3292       /**
 3293        * Returns an immutable list containing only the specified object.
 3294        * The returned list is serializable.
 3295        *
 3296        * @param o the sole object to be stored in the returned list.
 3297        * @return an immutable list containing only the specified object.
 3298        * @since 1.3
 3299        */
 3300       public static <T> List<T> singletonList(T o) {
 3301           return new SingletonList<T>(o);
 3302       }
 3303   
 3304       /**
 3305        * @serial include
 3306        */
 3307       private static class SingletonList<E>
 3308           extends AbstractList<E>
 3309           implements RandomAccess, Serializable {
 3310   
 3311           private static final long serialVersionUID = 3093736618740652951L;
 3312   
 3313           private final E element;
 3314   
 3315           SingletonList(E obj)                {element = obj;}
 3316   
 3317           public Iterator<E> iterator() {
 3318               return singletonIterator(element);
 3319           }
 3320   
 3321           public int size()                   {return 1;}
 3322   
 3323           public boolean contains(Object obj) {return eq(obj, element);}
 3324   
 3325           public E get(int index) {
 3326               if (index != 0)
 3327                 throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
 3328               return element;
 3329           }
 3330       }
 3331   
 3332       /**
 3333        * Returns an immutable map, mapping only the specified key to the
 3334        * specified value.  The returned map is serializable.
 3335        *
 3336        * @param key the sole key to be stored in the returned map.
 3337        * @param value the value to which the returned map maps <tt>key</tt>.
 3338        * @return an immutable map containing only the specified key-value
 3339        *         mapping.
 3340        * @since 1.3
 3341        */
 3342       public static <K,V> Map<K,V> singletonMap(K key, V value) {
 3343           return new SingletonMap<K,V>(key, value);
 3344       }
 3345   
 3346       /**
 3347        * @serial include
 3348        */
 3349       private static class SingletonMap<K,V>
 3350             extends AbstractMap<K,V>
 3351             implements Serializable {
 3352           private static final long serialVersionUID = -6979724477215052911L;
 3353   
 3354           private final K k;
 3355           private final V v;
 3356   
 3357           SingletonMap(K key, V value) {
 3358               k = key;
 3359               v = value;
 3360           }
 3361   
 3362           public int size()                          {return 1;}
 3363   
 3364           public boolean isEmpty()                   {return false;}
 3365   
 3366           public boolean containsKey(Object key)     {return eq(key, k);}
 3367   
 3368           public boolean containsValue(Object value) {return eq(value, v);}
 3369   
 3370           public V get(Object key)                   {return (eq(key, k) ? v : null);}
 3371   
 3372           private transient Set<K> keySet = null;
 3373           private transient Set<Map.Entry<K,V>> entrySet = null;
 3374           private transient Collection<V> values = null;
 3375   
 3376           public Set<K> keySet() {
 3377               if (keySet==null)
 3378                   keySet = singleton(k);
 3379               return keySet;
 3380           }
 3381   
 3382           public Set<Map.Entry<K,V>> entrySet() {
 3383               if (entrySet==null)
 3384                   entrySet = Collections.<Map.Entry<K,V>>singleton(
 3385                       new SimpleImmutableEntry<K,V>(k, v));
 3386               return entrySet;
 3387           }
 3388   
 3389           public Collection<V> values() {
 3390               if (values==null)
 3391                   values = singleton(v);
 3392               return values;
 3393           }
 3394   
 3395       }
 3396   
 3397       // Miscellaneous
 3398   
 3399       /**
 3400        * Returns an immutable list consisting of <tt>n</tt> copies of the
 3401        * specified object.  The newly allocated data object is tiny (it contains
 3402        * a single reference to the data object).  This method is useful in
 3403        * combination with the <tt>List.addAll</tt> method to grow lists.
 3404        * The returned list is serializable.
 3405        *
 3406        * @param  n the number of elements in the returned list.
 3407        * @param  o the element to appear repeatedly in the returned list.
 3408        * @return an immutable list consisting of <tt>n</tt> copies of the
 3409        *         specified object.
 3410        * @throws IllegalArgumentException if n &lt; 0.
 3411        * @see    List#addAll(Collection)
 3412        * @see    List#addAll(int, Collection)
 3413        */
 3414       public static <T> List<T> nCopies(int n, T o) {
 3415           if (n < 0)
 3416               throw new IllegalArgumentException("List length = " + n);
 3417           return new CopiesList<T>(n, o);
 3418       }
 3419   
 3420       /**
 3421        * @serial include
 3422        */
 3423       private static class CopiesList<E>
 3424           extends AbstractList<E>
 3425           implements RandomAccess, Serializable
 3426       {
 3427           private static final long serialVersionUID = 2739099268398711800L;
 3428   
 3429           final int n;
 3430           final E element;
 3431   
 3432           CopiesList(int n, E e) {
 3433               assert n >= 0;
 3434               this.n = n;
 3435               element = e;
 3436           }
 3437   
 3438           public int size() {
 3439               return n;
 3440           }
 3441   
 3442           public boolean contains(Object obj) {
 3443               return n != 0 && eq(obj, element);
 3444           }
 3445   
 3446           public int indexOf(Object o) {
 3447               return contains(o) ? 0 : -1;
 3448           }
 3449   
 3450           public int lastIndexOf(Object o) {
 3451               return contains(o) ? n - 1 : -1;
 3452           }
 3453   
 3454           public E get(int index) {
 3455               if (index < 0 || index >= n)
 3456                   throw new IndexOutOfBoundsException("Index: "+index+
 3457                                                       ", Size: "+n);
 3458               return element;
 3459           }
 3460   
 3461           public Object[] toArray() {
 3462               final Object[] a = new Object[n];
 3463               if (element != null)
 3464                   Arrays.fill(a, 0, n, element);
 3465               return a;
 3466           }
 3467   
 3468           public <T> T[] toArray(T[] a) {
 3469               final int n = this.n;
 3470               if (a.length < n) {
 3471                   a = (T[])java.lang.reflect.Array
 3472                       .newInstance(a.getClass().getComponentType(), n);
 3473                   if (element != null)
 3474                       Arrays.fill(a, 0, n, element);
 3475               } else {
 3476                   Arrays.fill(a, 0, n, element);
 3477                   if (a.length > n)
 3478                       a[n] = null;
 3479               }
 3480               return a;
 3481           }
 3482   
 3483           public List<E> subList(int fromIndex, int toIndex) {
 3484               if (fromIndex < 0)
 3485                   throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
 3486               if (toIndex > n)
 3487                   throw new IndexOutOfBoundsException("toIndex = " + toIndex);
 3488               if (fromIndex > toIndex)
 3489                   throw new IllegalArgumentException("fromIndex(" + fromIndex +
 3490                                                      ") > toIndex(" + toIndex + ")");
 3491               return new CopiesList<E>(toIndex - fromIndex, element);
 3492           }
 3493       }
 3494   
 3495       /**
 3496        * Returns a comparator that imposes the reverse of the <i>natural
 3497        * ordering</i> on a collection of objects that implement the
 3498        * <tt>Comparable</tt> interface.  (The natural ordering is the ordering
 3499        * imposed by the objects' own <tt>compareTo</tt> method.)  This enables a
 3500        * simple idiom for sorting (or maintaining) collections (or arrays) of
 3501        * objects that implement the <tt>Comparable</tt> interface in
 3502        * reverse-natural-order.  For example, suppose a is an array of
 3503        * strings. Then: <pre>
 3504        *          Arrays.sort(a, Collections.reverseOrder());
 3505        * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
 3506        *
 3507        * The returned comparator is serializable.
 3508        *
 3509        * @return a comparator that imposes the reverse of the <i>natural
 3510        *         ordering</i> on a collection of objects that implement
 3511        *         the <tt>Comparable</tt> interface.
 3512        * @see Comparable
 3513        */
 3514       public static <T> Comparator<T> reverseOrder() {
 3515           return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
 3516       }
 3517   
 3518       /**
 3519        * @serial include
 3520        */
 3521       private static class ReverseComparator
 3522           implements Comparator<Comparable<Object>>, Serializable {
 3523   
 3524           private static final long serialVersionUID = 7207038068494060240L;
 3525   
 3526           static final ReverseComparator REVERSE_ORDER
 3527               = new ReverseComparator();
 3528   
 3529           public int compare(Comparable<Object> c1, Comparable<Object> c2) {
 3530               return c2.compareTo(c1);
 3531           }
 3532   
 3533           private Object readResolve() { return reverseOrder(); }
 3534       }
 3535   
 3536       /**
 3537        * Returns a comparator that imposes the reverse ordering of the specified
 3538        * comparator.  If the specified comparator is null, this method is
 3539        * equivalent to {@link #reverseOrder()} (in other words, it returns a
 3540        * comparator that imposes the reverse of the <i>natural ordering</i> on a
 3541        * collection of objects that implement the Comparable interface).
 3542        *
 3543        * <p>The returned comparator is serializable (assuming the specified
 3544        * comparator is also serializable or null).
 3545        *
 3546        * @return a comparator that imposes the reverse ordering of the
 3547        *         specified comparator
 3548        * @since 1.5
 3549        */
 3550       public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
 3551           if (cmp == null)
 3552               return reverseOrder();
 3553   
 3554           if (cmp instanceof ReverseComparator2)
 3555               return ((ReverseComparator2<T>)cmp).cmp;
 3556   
 3557           return new ReverseComparator2<T>(cmp);
 3558       }
 3559   
 3560       /**
 3561        * @serial include
 3562        */
 3563       private static class ReverseComparator2<T> implements Comparator<T>,
 3564           Serializable
 3565       {
 3566           private static final long serialVersionUID = 4374092139857L;
 3567   
 3568           /**
 3569            * The comparator specified in the static factory.  This will never
 3570            * be null, as the static factory returns a ReverseComparator
 3571            * instance if its argument is null.
 3572            *
 3573            * @serial
 3574            */
 3575           final Comparator<T> cmp;
 3576   
 3577           ReverseComparator2(Comparator<T> cmp) {
 3578               assert cmp != null;
 3579               this.cmp = cmp;
 3580           }
 3581   
 3582           public int compare(T t1, T t2) {
 3583               return cmp.compare(t2, t1);
 3584           }
 3585   
 3586           public boolean equals(Object o) {
 3587               return (o == this) ||
 3588                   (o instanceof ReverseComparator2 &&
 3589                    cmp.equals(((ReverseComparator2)o).cmp));
 3590           }
 3591   
 3592           public int hashCode() {
 3593               return cmp.hashCode() ^ Integer.MIN_VALUE;
 3594           }
 3595       }
 3596   
 3597       /**
 3598        * Returns an enumeration over the specified collection.  This provides
 3599        * interoperability with legacy APIs that require an enumeration
 3600        * as input.
 3601        *
 3602        * @param c the collection for which an enumeration is to be returned.
 3603        * @return an enumeration over the specified collection.
 3604        * @see Enumeration
 3605        */
 3606       public static <T> Enumeration<T> enumeration(final Collection<T> c) {
 3607           return new Enumeration<T>() {
 3608               private final Iterator<T> i = c.iterator();
 3609   
 3610               public boolean hasMoreElements() {
 3611                   return i.hasNext();
 3612               }
 3613   
 3614               public T nextElement() {
 3615                   return i.next();
 3616               }
 3617           };
 3618       }
 3619   
 3620       /**
 3621        * Returns an array list containing the elements returned by the
 3622        * specified enumeration in the order they are returned by the
 3623        * enumeration.  This method provides interoperability between
 3624        * legacy APIs that return enumerations and new APIs that require
 3625        * collections.
 3626        *
 3627        * @param e enumeration providing elements for the returned
 3628        *          array list
 3629        * @return an array list containing the elements returned
 3630        *         by the specified enumeration.
 3631        * @since 1.4
 3632        * @see Enumeration
 3633        * @see ArrayList
 3634        */
 3635       public static <T> ArrayList<T> list(Enumeration<T> e) {
 3636           ArrayList<T> l = new ArrayList<T>();
 3637           while (e.hasMoreElements())
 3638               l.add(e.nextElement());
 3639           return l;
 3640       }
 3641   
 3642       /**
 3643        * Returns true if the specified arguments are equal, or both null.
 3644        */
 3645       static boolean eq(Object o1, Object o2) {
 3646           return o1==null ? o2==null : o1.equals(o2);
 3647       }
 3648   
 3649       /**
 3650        * Returns the number of elements in the specified collection equal to the
 3651        * specified object.  More formally, returns the number of elements
 3652        * <tt>e</tt> in the collection such that
 3653        * <tt>(o == null ? e == null : o.equals(e))</tt>.
 3654        *
 3655        * @param c the collection in which to determine the frequency
 3656        *     of <tt>o</tt>
 3657        * @param o the object whose frequency is to be determined
 3658        * @throws NullPointerException if <tt>c</tt> is null
 3659        * @since 1.5
 3660        */
 3661       public static int frequency(Collection<?> c, Object o) {
 3662           int result = 0;
 3663           if (o == null) {
 3664               for (Object e : c)
 3665                   if (e == null)
 3666                       result++;
 3667           } else {
 3668               for (Object e : c)
 3669                   if (o.equals(e))
 3670                       result++;
 3671           }
 3672           return result;
 3673       }
 3674   
 3675       /**
 3676        * Returns <tt>true</tt> if the two specified collections have no
 3677        * elements in common.
 3678        *
 3679        * <p>Care must be exercised if this method is used on collections that
 3680        * do not comply with the general contract for <tt>Collection</tt>.
 3681        * Implementations may elect to iterate over either collection and test
 3682        * for containment in the other collection (or to perform any equivalent
 3683        * computation).  If either collection uses a nonstandard equality test
 3684        * (as does a {@link SortedSet} whose ordering is not <i>compatible with
 3685        * equals</i>, or the key set of an {@link IdentityHashMap}), both
 3686        * collections must use the same nonstandard equality test, or the
 3687        * result of this method is undefined.
 3688        *
 3689        * <p>Note that it is permissible to pass the same collection in both
 3690        * parameters, in which case the method will return true if and only if
 3691        * the collection is empty.
 3692        *
 3693        * @param c1 a collection
 3694        * @param c2 a collection
 3695        * @throws NullPointerException if either collection is null
 3696        * @since 1.5
 3697        */
 3698       public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
 3699           /*
 3700            * We're going to iterate through c1 and test for inclusion in c2.
 3701            * If c1 is a Set and c2 isn't, swap the collections.  Otherwise,
 3702            * place the shorter collection in c1.  Hopefully this heuristic
 3703            * will minimize the cost of the operation.
 3704            */
 3705           if ((c1 instanceof Set) && !(c2 instanceof Set) ||
 3706               (c1.size() > c2.size())) {
 3707               Collection<?> tmp = c1;
 3708               c1 = c2;
 3709               c2 = tmp;
 3710           }
 3711   
 3712           for (Object e : c1)
 3713               if (c2.contains(e))
 3714                   return false;
 3715           return true;
 3716       }
 3717   
 3718       /**
 3719        * Adds all of the specified elements to the specified collection.
 3720        * Elements to be added may be specified individually or as an array.
 3721        * The behavior of this convenience method is identical to that of
 3722        * <tt>c.addAll(Arrays.asList(elements))</tt>, but this method is likely
 3723        * to run significantly faster under most implementations.
 3724        *
 3725        * <p>When elements are specified individually, this method provides a
 3726        * convenient way to add a few elements to an existing collection:
 3727        * <pre>
 3728        *     Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
 3729        * </pre>
 3730        *
 3731        * @param c the collection into which <tt>elements</tt> are to be inserted
 3732        * @param elements the elements to insert into <tt>c</tt>
 3733        * @return <tt>true</tt> if the collection changed as a result of the call
 3734        * @throws UnsupportedOperationException if <tt>c</tt> does not support
 3735        *         the <tt>add</tt> operation
 3736        * @throws NullPointerException if <tt>elements</tt> contains one or more
 3737        *         null values and <tt>c</tt> does not permit null elements, or
 3738        *         if <tt>c</tt> or <tt>elements</tt> are <tt>null</tt>
 3739        * @throws IllegalArgumentException if some property of a value in
 3740        *         <tt>elements</tt> prevents it from being added to <tt>c</tt>
 3741        * @see Collection#addAll(Collection)
 3742        * @since 1.5
 3743        */
 3744       public static <T> boolean addAll(Collection<? super T> c, T... elements) {
 3745           boolean result = false;
 3746           for (T element : elements)
 3747               result |= c.add(element);
 3748           return result;
 3749       }
 3750   
 3751       /**
 3752        * Returns a set backed by the specified map.  The resulting set displays
 3753        * the same ordering, concurrency, and performance characteristics as the
 3754        * backing map.  In essence, this factory method provides a {@link Set}
 3755        * implementation corresponding to any {@link Map} implementation.  There
 3756        * is no need to use this method on a {@link Map} implementation that
 3757        * already has a corresponding {@link Set} implementation (such as {@link
 3758        * HashMap} or {@link TreeMap}).
 3759        *
 3760        * <p>Each method invocation on the set returned by this method results in
 3761        * exactly one method invocation on the backing map or its <tt>keySet</tt>
 3762        * view, with one exception.  The <tt>addAll</tt> method is implemented
 3763        * as a sequence of <tt>put</tt> invocations on the backing map.
 3764        *
 3765        * <p>The specified map must be empty at the time this method is invoked,
 3766        * and should not be accessed directly after this method returns.  These
 3767        * conditions are ensured if the map is created empty, passed directly
 3768        * to this method, and no reference to the map is retained, as illustrated
 3769        * in the following code fragment:
 3770        * <pre>
 3771        *    Set&lt;Object&gt; weakHashSet = Collections.newSetFromMap(
 3772        *        new WeakHashMap&lt;Object, Boolean&gt;());
 3773        * </pre>
 3774        *
 3775        * @param map the backing map
 3776        * @return the set backed by the map
 3777        * @throws IllegalArgumentException if <tt>map</tt> is not empty
 3778        * @since 1.6
 3779        */
 3780       public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
 3781           return new SetFromMap<E>(map);
 3782       }
 3783   
 3784       /**
 3785        * @serial include
 3786        */
 3787       private static class SetFromMap<E> extends AbstractSet<E>
 3788           implements Set<E>, Serializable
 3789       {
 3790           private final Map<E, Boolean> m;  // The backing map
 3791           private transient Set<E> s;       // Its keySet
 3792   
 3793           SetFromMap(Map<E, Boolean> map) {
 3794               if (!map.isEmpty())
 3795                   throw new IllegalArgumentException("Map is non-empty");
 3796               m = map;
 3797               s = map.keySet();
 3798           }
 3799   
 3800           public void clear()               {        m.clear(); }
 3801           public int size()                 { return m.size(); }
 3802           public boolean isEmpty()          { return m.isEmpty(); }
 3803           public boolean contains(Object o) { return m.containsKey(o); }
 3804           public boolean remove(Object o)   { return m.remove(o) != null; }
 3805           public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
 3806           public Iterator<E> iterator()     { return s.iterator(); }
 3807           public Object[] toArray()         { return s.toArray(); }
 3808           public <T> T[] toArray(T[] a)     { return s.toArray(a); }
 3809           public String toString()          { return s.toString(); }
 3810           public int hashCode()             { return s.hashCode(); }
 3811           public boolean equals(Object o)   { return o == this || s.equals(o); }
 3812           public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
 3813           public boolean removeAll(Collection<?> c)   {return s.removeAll(c);}
 3814           public boolean retainAll(Collection<?> c)   {return s.retainAll(c);}
 3815           // addAll is the only inherited implementation
 3816   
 3817           private static final long serialVersionUID = 2454657854757543876L;
 3818   
 3819           private void readObject(java.io.ObjectInputStream stream)
 3820               throws IOException, ClassNotFoundException
 3821           {
 3822               stream.defaultReadObject();
 3823               s = m.keySet();
 3824           }
 3825       }
 3826   
 3827       /**
 3828        * Returns a view of a {@link Deque} as a Last-in-first-out (Lifo)
 3829        * {@link Queue}. Method <tt>add</tt> is mapped to <tt>push</tt>,
 3830        * <tt>remove</tt> is mapped to <tt>pop</tt> and so on. This
 3831        * view can be useful when you would like to use a method
 3832        * requiring a <tt>Queue</tt> but you need Lifo ordering.
 3833        *
 3834        * <p>Each method invocation on the queue returned by this method
 3835        * results in exactly one method invocation on the backing deque, with
 3836        * one exception.  The {@link Queue#addAll addAll} method is
 3837        * implemented as a sequence of {@link Deque#addFirst addFirst}
 3838        * invocations on the backing deque.
 3839        *
 3840        * @param deque the deque
 3841        * @return the queue
 3842        * @since  1.6
 3843        */
 3844       public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
 3845           return new AsLIFOQueue<T>(deque);
 3846       }
 3847   
 3848       /**
 3849        * @serial include
 3850        */
 3851       static class AsLIFOQueue<E> extends AbstractQueue<E>
 3852           implements Queue<E>, Serializable {
 3853           private static final long serialVersionUID = 1802017725587941708L;
 3854           private final Deque<E> q;
 3855           AsLIFOQueue(Deque<E> q)           { this.q = q; }
 3856           public boolean add(E e)           { q.addFirst(e); return true; }
 3857           public boolean offer(E e)         { return q.offerFirst(e); }
 3858           public E poll()                   { return q.pollFirst(); }
 3859           public E remove()                 { return q.removeFirst(); }
 3860           public E peek()                   { return q.peekFirst(); }
 3861           public E element()                { return q.getFirst(); }
 3862           public void clear()               {        q.clear(); }
 3863           public int size()                 { return q.size(); }
 3864           public boolean isEmpty()          { return q.isEmpty(); }
 3865           public boolean contains(Object o) { return q.contains(o); }
 3866           public boolean remove(Object o)   { return q.remove(o); }
 3867           public Iterator<E> iterator()     { return q.iterator(); }
 3868           public Object[] toArray()         { return q.toArray(); }
 3869           public <T> T[] toArray(T[] a)     { return q.toArray(a); }
 3870           public String toString()          { return q.toString(); }
 3871           public boolean containsAll(Collection<?> c) {return q.containsAll(c);}
 3872           public boolean removeAll(Collection<?> c)   {return q.removeAll(c);}
 3873           public boolean retainAll(Collection<?> c)   {return q.retainAll(c);}
 3874           // We use inherited addAll; forwarding addAll would be wrong
 3875       }
 3876   }

Save This Page
Home » openjdk-7 » java » util » [javadoc | source]