1 /*
   2  * Copyright (c) 1997, 2014, Oracle and/or its affiliates. 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * 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 import java.util.function.BiConsumer;
  32 import java.util.function.BiFunction;
  33 import java.util.function.Consumer;
  34 import java.util.function.Function;
  35 import java.util.function.Predicate;
  36 import java.util.function.UnaryOperator;
  37 import java.util.stream.IntStream;
  38 import java.util.stream.Stream;
  39 import java.util.stream.StreamSupport;
  40 
  41 /**
  42  * This class consists exclusively of static methods that operate on or return
  43  * collections.  It contains polymorphic algorithms that operate on
  44  * collections, "wrappers", which return a new collection backed by a
  45  * specified collection, and a few other odds and ends.
  46  *
  47  * <p>The methods of this class all throw a <tt>NullPointerException</tt>
  48  * if the collections or class objects provided to them are null.
  49  *
  50  * <p>The documentation for the polymorphic algorithms contained in this class
  51  * generally includes a brief description of the <i>implementation</i>.  Such
  52  * descriptions should be regarded as <i>implementation notes</i>, rather than
  53  * parts of the <i>specification</i>.  Implementors should feel free to
  54  * substitute other algorithms, so long as the specification itself is adhered
  55  * to.  (For example, the algorithm used by <tt>sort</tt> does not have to be
  56  * a mergesort, but it does have to be <i>stable</i>.)
  57  *
  58  * <p>The "destructive" algorithms contained in this class, that is, the
  59  * algorithms that modify the collection on which they operate, are specified
  60  * to throw <tt>UnsupportedOperationException</tt> if the collection does not
  61  * support the appropriate mutation primitive(s), such as the <tt>set</tt>
  62  * method.  These algorithms may, but are not required to, throw this
  63  * exception if an invocation would have no effect on the collection.  For
  64  * example, invoking the <tt>sort</tt> method on an unmodifiable list that is
  65  * already sorted may or may not throw <tt>UnsupportedOperationException</tt>.
  66  *
  67  * <p>This class is a member of the
  68  * <a href="{@docRoot}/../technotes/guides/collections/index.html">
  69  * Java Collections Framework</a>.
  70  *
  71  * @author  Josh Bloch
  72  * @author  Neal Gafter
  73  * @see     Collection
  74  * @see     Set
  75  * @see     List
  76  * @see     Map
  77  * @since   1.2
  78  */
  79 
  80 public class Collections {
  81     // Suppresses default constructor, ensuring non-instantiability.
  82     private Collections() {
  83     }
  84 
  85     // Algorithms
  86 
  87     /*
  88      * Tuning parameters for algorithms - Many of the List algorithms have
  89      * two implementations, one of which is appropriate for RandomAccess
  90      * lists, the other for "sequential."  Often, the random access variant
  91      * yields better performance on small sequential access lists.  The
  92      * tuning parameters below determine the cutoff point for what constitutes
  93      * a "small" sequential access list for each algorithm.  The values below
  94      * were empirically determined to work well for LinkedList. Hopefully
  95      * they should be reasonable for other sequential access List
  96      * implementations.  Those doing performance work on this code would
  97      * do well to validate the values of these parameters from time to time.
  98      * (The first word of each tuning parameter name is the algorithm to which
  99      * it applies.)
 100      */
 101     private static final int BINARYSEARCH_THRESHOLD   = 5000;
 102     private static final int REVERSE_THRESHOLD        =   18;
 103     private static final int SHUFFLE_THRESHOLD        =    5;
 104     private static final int FILL_THRESHOLD           =   25;
 105     private static final int ROTATE_THRESHOLD         =  100;
 106     private static final int COPY_THRESHOLD           =   10;
 107     private static final int REPLACEALL_THRESHOLD     =   11;
 108     private static final int INDEXOFSUBLIST_THRESHOLD =   35;
 109 
 110     /**
 111      * Sorts the specified list into ascending order, according to the
 112      * {@linkplain Comparable natural ordering} of its elements.
 113      * All elements in the list must implement the {@link Comparable}
 114      * interface.  Furthermore, all elements in the list must be
 115      * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)}
 116      * must not throw a {@code ClassCastException} for any elements
 117      * {@code e1} and {@code e2} in the list).
 118      *
 119      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
 120      * not be reordered as a result of the sort.
 121      *
 122      * <p>The specified list must be modifiable, but need not be resizable.
 123      *
 124      * @implNote
 125      * This implementation defers to the {@link List#sort(Comparator)}
 126      * method using the specified list and a {@code null} comparator.
 127      *
 128      * @param  <T> the class of the objects in the list
 129      * @param  list the list to be sorted.
 130      * @throws ClassCastException if the list contains elements that are not
 131      *         <i>mutually comparable</i> (for example, strings and integers).
 132      * @throws UnsupportedOperationException if the specified list's
 133      *         list-iterator does not support the {@code set} operation.
 134      * @throws IllegalArgumentException (optional) if the implementation
 135      *         detects that the natural ordering of the list elements is
 136      *         found to violate the {@link Comparable} contract
 137      * @see List#sort(Comparator)
 138      */
 139     @SuppressWarnings("unchecked")
 140     public static <T extends Comparable<? super T>> void sort(List<T> list) {
 141         list.sort(null);
 142     }
 143 
 144     /**
 145      * Sorts the specified list according to the order induced by the
 146      * specified comparator.  All elements in the list must be <i>mutually
 147      * comparable</i> using the specified comparator (that is,
 148      * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
 149      * for any elements {@code e1} and {@code e2} in the list).
 150      *
 151      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
 152      * not be reordered as a result of the sort.
 153      *
 154      * <p>The specified list must be modifiable, but need not be resizable.
 155      *
 156      * @implNote
 157      * This implementation defers to the {@link List#sort(Comparator)}
 158      * method using the specified list and comparator.
 159      *
 160      * @param  <T> the class of the objects in the list
 161      * @param  list the list to be sorted.
 162      * @param  c the comparator to determine the order of the list.  A
 163      *        {@code null} value indicates that the elements' <i>natural
 164      *        ordering</i> should be used.
 165      * @throws ClassCastException if the list contains elements that are not
 166      *         <i>mutually comparable</i> using the specified comparator.
 167      * @throws UnsupportedOperationException if the specified list's
 168      *         list-iterator does not support the {@code set} operation.
 169      * @throws IllegalArgumentException (optional) if the comparator is
 170      *         found to violate the {@link Comparator} contract
 171      * @see List#sort(Comparator)
 172      */
 173     @SuppressWarnings({"unchecked", "rawtypes"})
 174     public static <T> void sort(List<T> list, Comparator<? super T> c) {
 175         list.sort(c);
 176     }
 177 
 178 
 179     /**
 180      * Searches the specified list for the specified object using the binary
 181      * search algorithm.  The list must be sorted into ascending order
 182      * according to the {@linkplain Comparable natural ordering} of its
 183      * elements (as by the {@link #sort(List)} method) prior to making this
 184      * call.  If it is not sorted, the results are undefined.  If the list
 185      * contains multiple elements equal to the specified object, there is no
 186      * guarantee which one will be found.
 187      *
 188      * <p>This method runs in log(n) time for a "random access" list (which
 189      * provides near-constant-time positional access).  If the specified list
 190      * does not implement the {@link RandomAccess} interface and is large,
 191      * this method will do an iterator-based binary search that performs
 192      * O(n) link traversals and O(log n) element comparisons.
 193      *
 194      * @param  <T> the class of the objects in the list
 195      * @param  list the list to be searched.
 196      * @param  key the key to be searched for.
 197      * @return the index of the search key, if it is contained in the list;
 198      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
 199      *         <i>insertion point</i> is defined as the point at which the
 200      *         key would be inserted into the list: the index of the first
 201      *         element greater than the key, or <tt>list.size()</tt> if all
 202      *         elements in the list are less than the specified key.  Note
 203      *         that this guarantees that the return value will be &gt;= 0 if
 204      *         and only if the key is found.
 205      * @throws ClassCastException if the list contains elements that are not
 206      *         <i>mutually comparable</i> (for example, strings and
 207      *         integers), or the search key is not mutually comparable
 208      *         with the elements of the list.
 209      */
 210     public static <T>
 211     int binarySearch(List<? extends Comparable<? super T>> list, T key) {
 212         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
 213             return Collections.indexedBinarySearch(list, key);
 214         else
 215             return Collections.iteratorBinarySearch(list, key);
 216     }
 217 
 218     private static <T>
 219     int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
 220         int low = 0;
 221         int high = list.size()-1;
 222 
 223         while (low <= high) {
 224             int mid = (low + high) >>> 1;
 225             Comparable<? super T> midVal = list.get(mid);
 226             int cmp = midVal.compareTo(key);
 227 
 228             if (cmp < 0)
 229                 low = mid + 1;
 230             else if (cmp > 0)
 231                 high = mid - 1;
 232             else
 233                 return mid; // key found
 234         }
 235         return -(low + 1);  // key not found
 236     }
 237 
 238     private static <T>
 239     int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
 240     {
 241         int low = 0;
 242         int high = list.size()-1;
 243         ListIterator<? extends Comparable<? super T>> i = list.listIterator();
 244 
 245         while (low <= high) {
 246             int mid = (low + high) >>> 1;
 247             Comparable<? super T> midVal = get(i, mid);
 248             int cmp = midVal.compareTo(key);
 249 
 250             if (cmp < 0)
 251                 low = mid + 1;
 252             else if (cmp > 0)
 253                 high = mid - 1;
 254             else
 255                 return mid; // key found
 256         }
 257         return -(low + 1);  // key not found
 258     }
 259 
 260     /**
 261      * Gets the ith element from the given list by repositioning the specified
 262      * list listIterator.
 263      */
 264     private static <T> T get(ListIterator<? extends T> i, int index) {
 265         T obj = null;
 266         int pos = i.nextIndex();
 267         if (pos <= index) {
 268             do {
 269                 obj = i.next();
 270             } while (pos++ < index);
 271         } else {
 272             do {
 273                 obj = i.previous();
 274             } while (--pos > index);
 275         }
 276         return obj;
 277     }
 278 
 279     /**
 280      * Searches the specified list for the specified object using the binary
 281      * search algorithm.  The list must be sorted into ascending order
 282      * according to the specified comparator (as by the
 283      * {@link #sort(List, Comparator) sort(List, Comparator)}
 284      * method), prior to making this call.  If it is
 285      * not sorted, the results are undefined.  If the list contains multiple
 286      * elements equal to the specified object, there is no guarantee which one
 287      * will be found.
 288      *
 289      * <p>This method runs in log(n) time for a "random access" list (which
 290      * provides near-constant-time positional access).  If the specified list
 291      * does not implement the {@link RandomAccess} interface and is large,
 292      * this method will do an iterator-based binary search that performs
 293      * O(n) link traversals and O(log n) element comparisons.
 294      *
 295      * @param  <T> the class of the objects in the list
 296      * @param  list the list to be searched.
 297      * @param  key the key to be searched for.
 298      * @param  c the comparator by which the list is ordered.
 299      *         A <tt>null</tt> value indicates that the elements'
 300      *         {@linkplain Comparable natural ordering} should be used.
 301      * @return the index of the search key, if it is contained in the list;
 302      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
 303      *         <i>insertion point</i> is defined as the point at which the
 304      *         key would be inserted into the list: the index of the first
 305      *         element greater than the key, or <tt>list.size()</tt> if all
 306      *         elements in the list are less than the specified key.  Note
 307      *         that this guarantees that the return value will be &gt;= 0 if
 308      *         and only if the key is found.
 309      * @throws ClassCastException if the list contains elements that are not
 310      *         <i>mutually comparable</i> using the specified comparator,
 311      *         or the search key is not mutually comparable with the
 312      *         elements of the list using this comparator.
 313      */
 314     @SuppressWarnings("unchecked")
 315     public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
 316         if (c==null)
 317             return binarySearch((List<? extends Comparable<? super T>>) list, key);
 318 
 319         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
 320             return Collections.indexedBinarySearch(list, key, c);
 321         else
 322             return Collections.iteratorBinarySearch(list, key, c);
 323     }
 324 
 325     private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
 326         int low = 0;
 327         int high = l.size()-1;
 328 
 329         while (low <= high) {
 330             int mid = (low + high) >>> 1;
 331             T midVal = l.get(mid);
 332             int cmp = c.compare(midVal, key);
 333 
 334             if (cmp < 0)
 335                 low = mid + 1;
 336             else if (cmp > 0)
 337                 high = mid - 1;
 338             else
 339                 return mid; // key found
 340         }
 341         return -(low + 1);  // key not found
 342     }
 343 
 344     private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
 345         int low = 0;
 346         int high = l.size()-1;
 347         ListIterator<? extends T> i = l.listIterator();
 348 
 349         while (low <= high) {
 350             int mid = (low + high) >>> 1;
 351             T midVal = get(i, mid);
 352             int cmp = c.compare(midVal, key);
 353 
 354             if (cmp < 0)
 355                 low = mid + 1;
 356             else if (cmp > 0)
 357                 high = mid - 1;
 358             else
 359                 return mid; // key found
 360         }
 361         return -(low + 1);  // key not found
 362     }
 363 
 364     /**
 365      * Reverses the order of the elements in the specified list.<p>
 366      *
 367      * This method runs in linear time.
 368      *
 369      * @param  list the list whose elements are to be reversed.
 370      * @throws UnsupportedOperationException if the specified list or
 371      *         its list-iterator does not support the <tt>set</tt> operation.
 372      */
 373     @SuppressWarnings({"rawtypes", "unchecked"})
 374     public static void reverse(List<?> list) {
 375         int size = list.size();
 376         if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
 377             for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
 378                 swap(list, i, j);
 379         } else {
 380             // instead of using a raw type here, it's possible to capture
 381             // the wildcard but it will require a call to a supplementary
 382             // private method
 383             ListIterator fwd = list.listIterator();
 384             ListIterator rev = list.listIterator(size);
 385             for (int i=0, mid=list.size()>>1; i<mid; i++) {
 386                 Object tmp = fwd.next();
 387                 fwd.set(rev.previous());
 388                 rev.set(tmp);
 389             }
 390         }
 391     }
 392 
 393     /**
 394      * Randomly permutes the specified list using a default source of
 395      * randomness.  All permutations occur with approximately equal
 396      * likelihood.
 397      *
 398      * <p>The hedge "approximately" is used in the foregoing description because
 399      * default source of randomness is only approximately an unbiased source
 400      * of independently chosen bits. If it were a perfect source of randomly
 401      * chosen bits, then the algorithm would choose permutations with perfect
 402      * uniformity.
 403      *
 404      * <p>This implementation traverses the list backwards, from the last
 405      * element up to the second, repeatedly swapping a randomly selected element
 406      * into the "current position".  Elements are randomly selected from the
 407      * portion of the list that runs from the first element to the current
 408      * position, inclusive.
 409      *
 410      * <p>This method runs in linear time.  If the specified list does not
 411      * implement the {@link RandomAccess} interface and is large, this
 412      * implementation dumps the specified list into an array before shuffling
 413      * it, and dumps the shuffled array back into the list.  This avoids the
 414      * quadratic behavior that would result from shuffling a "sequential
 415      * access" list in place.
 416      *
 417      * @param  list the list to be shuffled.
 418      * @throws UnsupportedOperationException if the specified list or
 419      *         its list-iterator does not support the <tt>set</tt> operation.
 420      */
 421     public static void shuffle(List<?> list) {
 422         Random rnd = r;
 423         if (rnd == null)
 424             r = rnd = new Random(); // harmless race.
 425         shuffle(list, rnd);
 426     }
 427 
 428     private static Random r;
 429 
 430     /**
 431      * Randomly permute the specified list using the specified source of
 432      * randomness.  All permutations occur with equal likelihood
 433      * assuming that the source of randomness is fair.<p>
 434      *
 435      * This implementation traverses the list backwards, from the last element
 436      * up to the second, repeatedly swapping a randomly selected element into
 437      * the "current position".  Elements are randomly selected from the
 438      * portion of the list that runs from the first element to the current
 439      * position, inclusive.<p>
 440      *
 441      * This method runs in linear time.  If the specified list does not
 442      * implement the {@link RandomAccess} interface and is large, this
 443      * implementation dumps the specified list into an array before shuffling
 444      * it, and dumps the shuffled array back into the list.  This avoids the
 445      * quadratic behavior that would result from shuffling a "sequential
 446      * access" list in place.
 447      *
 448      * @param  list the list to be shuffled.
 449      * @param  rnd the source of randomness to use to shuffle the list.
 450      * @throws UnsupportedOperationException if the specified list or its
 451      *         list-iterator does not support the <tt>set</tt> operation.
 452      */
 453     @SuppressWarnings({"rawtypes", "unchecked"})
 454     public static void shuffle(List<?> list, Random rnd) {
 455         int size = list.size();
 456         if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
 457             for (int i=size; i>1; i--)
 458                 swap(list, i-1, rnd.nextInt(i));
 459         } else {
 460             Object arr[] = list.toArray();
 461 
 462             // Shuffle array
 463             for (int i=size; i>1; i--)
 464                 swap(arr, i-1, rnd.nextInt(i));
 465 
 466             // Dump array back into list
 467             // instead of using a raw type here, it's possible to capture
 468             // the wildcard but it will require a call to a supplementary
 469             // private method
 470             ListIterator it = list.listIterator();
 471             for (Object e : arr) {
 472                 it.next();
 473                 it.set(e);
 474             }
 475         }
 476     }
 477 
 478     /**
 479      * Swaps the elements at the specified positions in the specified list.
 480      * (If the specified positions are equal, invoking this method leaves
 481      * the list unchanged.)
 482      *
 483      * @param list The list in which to swap elements.
 484      * @param i the index of one element to be swapped.
 485      * @param j the index of the other element to be swapped.
 486      * @throws IndexOutOfBoundsException if either <tt>i</tt> or <tt>j</tt>
 487      *         is out of range (i &lt; 0 || i &gt;= list.size()
 488      *         || j &lt; 0 || j &gt;= list.size()).
 489      * @since 1.4
 490      */
 491     @SuppressWarnings({"rawtypes", "unchecked"})
 492     public static void swap(List<?> list, int i, int j) {
 493         // instead of using a raw type here, it's possible to capture
 494         // the wildcard but it will require a call to a supplementary
 495         // private method
 496         final List l = list;
 497         l.set(i, l.set(j, l.get(i)));
 498     }
 499 
 500     /**
 501      * Swaps the two specified elements in the specified array.
 502      */
 503     private static void swap(Object[] arr, int i, int j) {
 504         Object tmp = arr[i];
 505         arr[i] = arr[j];
 506         arr[j] = tmp;
 507     }
 508 
 509     /**
 510      * Replaces all of the elements of the specified list with the specified
 511      * element. <p>
 512      *
 513      * This method runs in linear time.
 514      *
 515      * @param  <T> the class of the objects in the list
 516      * @param  list the list to be filled with the specified element.
 517      * @param  obj The element with which to fill the specified list.
 518      * @throws UnsupportedOperationException if the specified list or its
 519      *         list-iterator does not support the <tt>set</tt> operation.
 520      */
 521     public static <T> void fill(List<? super T> list, T obj) {
 522         int size = list.size();
 523 
 524         if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
 525             for (int i=0; i<size; i++)
 526                 list.set(i, obj);
 527         } else {
 528             ListIterator<? super T> itr = list.listIterator();
 529             for (int i=0; i<size; i++) {
 530                 itr.next();
 531                 itr.set(obj);
 532             }
 533         }
 534     }
 535 
 536     /**
 537      * Copies all of the elements from one list into another.  After the
 538      * operation, the index of each copied element in the destination list
 539      * will be identical to its index in the source list.  The destination
 540      * list must be at least as long as the source list.  If it is longer, the
 541      * remaining elements in the destination list are unaffected. <p>
 542      *
 543      * This method runs in linear time.
 544      *
 545      * @param  <T> the class of the objects in the lists
 546      * @param  dest The destination list.
 547      * @param  src The source list.
 548      * @throws IndexOutOfBoundsException if the destination list is too small
 549      *         to contain the entire source List.
 550      * @throws UnsupportedOperationException if the destination list's
 551      *         list-iterator does not support the <tt>set</tt> operation.
 552      */
 553     public static <T> void copy(List<? super T> dest, List<? extends T> src) {
 554         int srcSize = src.size();
 555         if (srcSize > dest.size())
 556             throw new IndexOutOfBoundsException("Source does not fit in dest");
 557 
 558         if (srcSize < COPY_THRESHOLD ||
 559             (src instanceof RandomAccess && dest instanceof RandomAccess)) {
 560             for (int i=0; i<srcSize; i++)
 561                 dest.set(i, src.get(i));
 562         } else {
 563             ListIterator<? super T> di=dest.listIterator();
 564             ListIterator<? extends T> si=src.listIterator();
 565             for (int i=0; i<srcSize; i++) {
 566                 di.next();
 567                 di.set(si.next());
 568             }
 569         }
 570     }
 571 
 572     /**
 573      * Returns the minimum element of the given collection, according to the
 574      * <i>natural ordering</i> of its elements.  All elements in the
 575      * collection must implement the <tt>Comparable</tt> interface.
 576      * Furthermore, all elements in the collection must be <i>mutually
 577      * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
 578      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
 579      * <tt>e2</tt> in the collection).<p>
 580      *
 581      * This method iterates over the entire collection, hence it requires
 582      * time proportional to the size of the collection.
 583      *
 584      * @param  <T> the class of the objects in the collection
 585      * @param  coll the collection whose minimum element is to be determined.
 586      * @return the minimum element of the given collection, according
 587      *         to the <i>natural ordering</i> of its elements.
 588      * @throws ClassCastException if the collection contains elements that are
 589      *         not <i>mutually comparable</i> (for example, strings and
 590      *         integers).
 591      * @throws NoSuchElementException if the collection is empty.
 592      * @see Comparable
 593      */
 594     public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
 595         Iterator<? extends T> i = coll.iterator();
 596         T candidate = i.next();
 597 
 598         while (i.hasNext()) {
 599             T next = i.next();
 600             if (next.compareTo(candidate) < 0)
 601                 candidate = next;
 602         }
 603         return candidate;
 604     }
 605 
 606     /**
 607      * Returns the minimum element of the given collection, according to the
 608      * order induced by the specified comparator.  All elements in the
 609      * collection must be <i>mutually comparable</i> by the specified
 610      * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
 611      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
 612      * <tt>e2</tt> in the collection).<p>
 613      *
 614      * This method iterates over the entire collection, hence it requires
 615      * time proportional to the size of the collection.
 616      *
 617      * @param  <T> the class of the objects in the collection
 618      * @param  coll the collection whose minimum element is to be determined.
 619      * @param  comp the comparator with which to determine the minimum element.
 620      *         A <tt>null</tt> value indicates that the elements' <i>natural
 621      *         ordering</i> should be used.
 622      * @return the minimum element of the given collection, according
 623      *         to the specified comparator.
 624      * @throws ClassCastException if the collection contains elements that are
 625      *         not <i>mutually comparable</i> using the specified comparator.
 626      * @throws NoSuchElementException if the collection is empty.
 627      * @see Comparable
 628      */
 629     @SuppressWarnings({"unchecked", "rawtypes"})
 630     public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
 631         if (comp==null)
 632             return (T)min((Collection) coll);
 633 
 634         Iterator<? extends T> i = coll.iterator();
 635         T candidate = i.next();
 636 
 637         while (i.hasNext()) {
 638             T next = i.next();
 639             if (comp.compare(next, candidate) < 0)
 640                 candidate = next;
 641         }
 642         return candidate;
 643     }
 644 
 645     /**
 646      * Returns the maximum element of the given collection, according to the
 647      * <i>natural ordering</i> of its elements.  All elements in the
 648      * collection must implement the <tt>Comparable</tt> interface.
 649      * Furthermore, all elements in the collection must be <i>mutually
 650      * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
 651      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
 652      * <tt>e2</tt> in the collection).<p>
 653      *
 654      * This method iterates over the entire collection, hence it requires
 655      * time proportional to the size of the collection.
 656      *
 657      * @param  <T> the class of the objects in the collection
 658      * @param  coll the collection whose maximum element is to be determined.
 659      * @return the maximum element of the given collection, according
 660      *         to the <i>natural ordering</i> of its elements.
 661      * @throws ClassCastException if the collection contains elements that are
 662      *         not <i>mutually comparable</i> (for example, strings and
 663      *         integers).
 664      * @throws NoSuchElementException if the collection is empty.
 665      * @see Comparable
 666      */
 667     public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
 668         Iterator<? extends T> i = coll.iterator();
 669         T candidate = i.next();
 670 
 671         while (i.hasNext()) {
 672             T next = i.next();
 673             if (next.compareTo(candidate) > 0)
 674                 candidate = next;
 675         }
 676         return candidate;
 677     }
 678 
 679     /**
 680      * Returns the maximum element of the given collection, according to the
 681      * order induced by the specified comparator.  All elements in the
 682      * collection must be <i>mutually comparable</i> by the specified
 683      * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
 684      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
 685      * <tt>e2</tt> in the collection).<p>
 686      *
 687      * This method iterates over the entire collection, hence it requires
 688      * time proportional to the size of the collection.
 689      *
 690      * @param  <T> the class of the objects in the collection
 691      * @param  coll the collection whose maximum element is to be determined.
 692      * @param  comp the comparator with which to determine the maximum element.
 693      *         A <tt>null</tt> value indicates that the elements' <i>natural
 694      *        ordering</i> should be used.
 695      * @return the maximum element of the given collection, according
 696      *         to the specified comparator.
 697      * @throws ClassCastException if the collection contains elements that are
 698      *         not <i>mutually comparable</i> using the specified comparator.
 699      * @throws NoSuchElementException if the collection is empty.
 700      * @see Comparable
 701      */
 702     @SuppressWarnings({"unchecked", "rawtypes"})
 703     public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
 704         if (comp==null)
 705             return (T)max((Collection) coll);
 706 
 707         Iterator<? extends T> i = coll.iterator();
 708         T candidate = i.next();
 709 
 710         while (i.hasNext()) {
 711             T next = i.next();
 712             if (comp.compare(next, candidate) > 0)
 713                 candidate = next;
 714         }
 715         return candidate;
 716     }
 717 
 718     /**
 719      * Rotates the elements in the specified list by the specified distance.
 720      * After calling this method, the element at index <tt>i</tt> will be
 721      * the element previously at index <tt>(i - distance)</tt> mod
 722      * <tt>list.size()</tt>, for all values of <tt>i</tt> between <tt>0</tt>
 723      * and <tt>list.size()-1</tt>, inclusive.  (This method has no effect on
 724      * the size of the list.)
 725      *
 726      * <p>For example, suppose <tt>list</tt> comprises<tt> [t, a, n, k, s]</tt>.
 727      * After invoking <tt>Collections.rotate(list, 1)</tt> (or
 728      * <tt>Collections.rotate(list, -4)</tt>), <tt>list</tt> will comprise
 729      * <tt>[s, t, a, n, k]</tt>.
 730      *
 731      * <p>Note that this method can usefully be applied to sublists to
 732      * move one or more elements within a list while preserving the
 733      * order of the remaining elements.  For example, the following idiom
 734      * moves the element at index <tt>j</tt> forward to position
 735      * <tt>k</tt> (which must be greater than or equal to <tt>j</tt>):
 736      * <pre>
 737      *     Collections.rotate(list.subList(j, k+1), -1);
 738      * </pre>
 739      * To make this concrete, suppose <tt>list</tt> comprises
 740      * <tt>[a, b, c, d, e]</tt>.  To move the element at index <tt>1</tt>
 741      * (<tt>b</tt>) forward two positions, perform the following invocation:
 742      * <pre>
 743      *     Collections.rotate(l.subList(1, 4), -1);
 744      * </pre>
 745      * The resulting list is <tt>[a, c, d, b, e]</tt>.
 746      *
 747      * <p>To move more than one element forward, increase the absolute value
 748      * of the rotation distance.  To move elements backward, use a positive
 749      * shift distance.
 750      *
 751      * <p>If the specified list is small or implements the {@link
 752      * RandomAccess} interface, this implementation exchanges the first
 753      * element into the location it should go, and then repeatedly exchanges
 754      * the displaced element into the location it should go until a displaced
 755      * element is swapped into the first element.  If necessary, the process
 756      * is repeated on the second and successive elements, until the rotation
 757      * is complete.  If the specified list is large and doesn't implement the
 758      * <tt>RandomAccess</tt> interface, this implementation breaks the
 759      * list into two sublist views around index <tt>-distance mod size</tt>.
 760      * Then the {@link #reverse(List)} method is invoked on each sublist view,
 761      * and finally it is invoked on the entire list.  For a more complete
 762      * description of both algorithms, see Section 2.3 of Jon Bentley's
 763      * <i>Programming Pearls</i> (Addison-Wesley, 1986).
 764      *
 765      * @param list the list to be rotated.
 766      * @param distance the distance to rotate the list.  There are no
 767      *        constraints on this value; it may be zero, negative, or
 768      *        greater than <tt>list.size()</tt>.
 769      * @throws UnsupportedOperationException if the specified list or
 770      *         its list-iterator does not support the <tt>set</tt> operation.
 771      * @since 1.4
 772      */
 773     public static void rotate(List<?> list, int distance) {
 774         if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
 775             rotate1(list, distance);
 776         else
 777             rotate2(list, distance);
 778     }
 779 
 780     private static <T> void rotate1(List<T> list, int distance) {
 781         int size = list.size();
 782         if (size == 0)
 783             return;
 784         distance = distance % size;
 785         if (distance < 0)
 786             distance += size;
 787         if (distance == 0)
 788             return;
 789 
 790         for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
 791             T displaced = list.get(cycleStart);
 792             int i = cycleStart;
 793             do {
 794                 i += distance;
 795                 if (i >= size)
 796                     i -= size;
 797                 displaced = list.set(i, displaced);
 798                 nMoved ++;
 799             } while (i != cycleStart);
 800         }
 801     }
 802 
 803     private static void rotate2(List<?> list, int distance) {
 804         int size = list.size();
 805         if (size == 0)
 806             return;
 807         int mid =  -distance % size;
 808         if (mid < 0)
 809             mid += size;
 810         if (mid == 0)
 811             return;
 812 
 813         reverse(list.subList(0, mid));
 814         reverse(list.subList(mid, size));
 815         reverse(list);
 816     }
 817 
 818     /**
 819      * Replaces all occurrences of one specified value in a list with another.
 820      * More formally, replaces with <tt>newVal</tt> each element <tt>e</tt>
 821      * in <tt>list</tt> such that
 822      * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
 823      * (This method has no effect on the size of the list.)
 824      *
 825      * @param  <T> the class of the objects in the list
 826      * @param list the list in which replacement is to occur.
 827      * @param oldVal the old value to be replaced.
 828      * @param newVal the new value with which <tt>oldVal</tt> is to be
 829      *        replaced.
 830      * @return <tt>true</tt> if <tt>list</tt> contained one or more elements
 831      *         <tt>e</tt> such that
 832      *         <tt>(oldVal==null ?  e==null : oldVal.equals(e))</tt>.
 833      * @throws UnsupportedOperationException if the specified list or
 834      *         its list-iterator does not support the <tt>set</tt> operation.
 835      * @since  1.4
 836      */
 837     public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
 838         boolean result = false;
 839         int size = list.size();
 840         if (size < REPLACEALL_THRESHOLD || list instanceof RandomAccess) {
 841             if (oldVal==null) {
 842                 for (int i=0; i<size; i++) {
 843                     if (list.get(i)==null) {
 844                         list.set(i, newVal);
 845                         result = true;
 846                     }
 847                 }
 848             } else {
 849                 for (int i=0; i<size; i++) {
 850                     if (oldVal.equals(list.get(i))) {
 851                         list.set(i, newVal);
 852                         result = true;
 853                     }
 854                 }
 855             }
 856         } else {
 857             ListIterator<T> itr=list.listIterator();
 858             if (oldVal==null) {
 859                 for (int i=0; i<size; i++) {
 860                     if (itr.next()==null) {
 861                         itr.set(newVal);
 862                         result = true;
 863                     }
 864                 }
 865             } else {
 866                 for (int i=0; i<size; i++) {
 867                     if (oldVal.equals(itr.next())) {
 868                         itr.set(newVal);
 869                         result = true;
 870                     }
 871                 }
 872             }
 873         }
 874         return result;
 875     }
 876 
 877     /**
 878      * Returns the starting position of the first occurrence of the specified
 879      * target list within the specified source list, or -1 if there is no
 880      * such occurrence.  More formally, returns the lowest index <tt>i</tt>
 881      * such that {@code source.subList(i, i+target.size()).equals(target)},
 882      * or -1 if there is no such index.  (Returns -1 if
 883      * {@code target.size() > source.size()})
 884      *
 885      * <p>This implementation uses the "brute force" technique of scanning
 886      * over the source list, looking for a match with the target at each
 887      * location in turn.
 888      *
 889      * @param source the list in which to search for the first occurrence
 890      *        of <tt>target</tt>.
 891      * @param target the list to search for as a subList of <tt>source</tt>.
 892      * @return the starting position of the first occurrence of the specified
 893      *         target list within the specified source list, or -1 if there
 894      *         is no such occurrence.
 895      * @since  1.4
 896      */
 897     public static int indexOfSubList(List<?> source, List<?> target) {
 898         int sourceSize = source.size();
 899         int targetSize = target.size();
 900         int maxCandidate = sourceSize - targetSize;
 901 
 902         if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
 903             (source instanceof RandomAccess&&target instanceof RandomAccess)) {
 904         nextCand:
 905             for (int candidate = 0; candidate <= maxCandidate; candidate++) {
 906                 for (int i=0, j=candidate; i<targetSize; i++, j++)
 907                     if (!eq(target.get(i), source.get(j)))
 908                         continue nextCand;  // Element mismatch, try next cand
 909                 return candidate;  // All elements of candidate matched target
 910             }
 911         } else {  // Iterator version of above algorithm
 912             ListIterator<?> si = source.listIterator();
 913         nextCand:
 914             for (int candidate = 0; candidate <= maxCandidate; candidate++) {
 915                 ListIterator<?> ti = target.listIterator();
 916                 for (int i=0; i<targetSize; i++) {
 917                     if (!eq(ti.next(), si.next())) {
 918                         // Back up source iterator to next candidate
 919                         for (int j=0; j<i; j++)
 920                             si.previous();
 921                         continue nextCand;
 922                     }
 923                 }
 924                 return candidate;
 925             }
 926         }
 927         return -1;  // No candidate matched the target
 928     }
 929 
 930     /**
 931      * Returns the starting position of the last occurrence of the specified
 932      * target list within the specified source list, or -1 if there is no such
 933      * occurrence.  More formally, returns the highest index <tt>i</tt>
 934      * such that {@code source.subList(i, i+target.size()).equals(target)},
 935      * or -1 if there is no such index.  (Returns -1 if
 936      * {@code target.size() > source.size()})
 937      *
 938      * <p>This implementation uses the "brute force" technique of iterating
 939      * over the source list, looking for a match with the target at each
 940      * location in turn.
 941      *
 942      * @param source the list in which to search for the last occurrence
 943      *        of <tt>target</tt>.
 944      * @param target the list to search for as a subList of <tt>source</tt>.
 945      * @return the starting position of the last occurrence of the specified
 946      *         target list within the specified source list, or -1 if there
 947      *         is no such occurrence.
 948      * @since  1.4
 949      */
 950     public static int lastIndexOfSubList(List<?> source, List<?> target) {
 951         int sourceSize = source.size();
 952         int targetSize = target.size();
 953         int maxCandidate = sourceSize - targetSize;
 954 
 955         if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
 956             source instanceof RandomAccess) {   // Index access version
 957         nextCand:
 958             for (int candidate = maxCandidate; candidate >= 0; candidate--) {
 959                 for (int i=0, j=candidate; i<targetSize; i++, j++)
 960                     if (!eq(target.get(i), source.get(j)))
 961                         continue nextCand;  // Element mismatch, try next cand
 962                 return candidate;  // All elements of candidate matched target
 963             }
 964         } else {  // Iterator version of above algorithm
 965             if (maxCandidate < 0)
 966                 return -1;
 967             ListIterator<?> si = source.listIterator(maxCandidate);
 968         nextCand:
 969             for (int candidate = maxCandidate; candidate >= 0; candidate--) {
 970                 ListIterator<?> ti = target.listIterator();
 971                 for (int i=0; i<targetSize; i++) {
 972                     if (!eq(ti.next(), si.next())) {
 973                         if (candidate != 0) {
 974                             // Back up source iterator to next candidate
 975                             for (int j=0; j<=i+1; j++)
 976                                 si.previous();
 977                         }
 978                         continue nextCand;
 979                     }
 980                 }
 981                 return candidate;
 982             }
 983         }
 984         return -1;  // No candidate matched the target
 985     }
 986 
 987 
 988     // Unmodifiable Wrappers
 989 
 990     /**
 991      * Returns an unmodifiable view of the specified collection.  This method
 992      * allows modules to provide users with "read-only" access to internal
 993      * collections.  Query operations on the returned collection "read through"
 994      * to the specified collection, and attempts to modify the returned
 995      * collection, whether direct or via its iterator, result in an
 996      * <tt>UnsupportedOperationException</tt>.<p>
 997      *
 998      * The returned collection does <i>not</i> pass the hashCode and equals
 999      * operations through to the backing collection, but relies on
1000      * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods.  This
1001      * is necessary to preserve the contracts of these operations in the case
1002      * that the backing collection is a set or a list.<p>
1003      *
1004      * The returned collection will be serializable if the specified collection
1005      * is serializable.
1006      *
1007      * @param  <T> the class of the objects in the collection
1008      * @param  c the collection for which an unmodifiable view is to be
1009      *         returned.
1010      * @return an unmodifiable view of the specified collection.
1011      */
1012     public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
1013         return new UnmodifiableCollection<>(c);
1014     }
1015 
1016     /**
1017      * @serial include
1018      */
1019     static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
1020         private static final long serialVersionUID = 1820017752578914078L;
1021 
1022         final Collection<? extends E> c;
1023 
1024         UnmodifiableCollection(Collection<? extends E> c) {
1025             if (c==null)
1026                 throw new NullPointerException();
1027             this.c = c;
1028         }
1029 
1030         public int size()                   {return c.size();}
1031         public boolean isEmpty()            {return c.isEmpty();}
1032         public boolean contains(Object o)   {return c.contains(o);}
1033         public Object[] toArray()           {return c.toArray();}
1034         public <T> T[] toArray(T[] a)       {return c.toArray(a);}
1035         public String toString()            {return c.toString();}
1036 
1037         public Iterator<E> iterator() {
1038             return new Iterator<E>() {
1039                 private final Iterator<? extends E> i = c.iterator();
1040 
1041                 public boolean hasNext() {return i.hasNext();}
1042                 public E next()          {return i.next();}
1043                 public void remove() {
1044                     throw new UnsupportedOperationException();
1045                 }
1046                 @Override
1047                 public void forEachRemaining(Consumer<? super E> action) {
1048                     // Use backing collection version
1049                     i.forEachRemaining(action);
1050                 }
1051             };
1052         }
1053 
1054         public boolean add(E e) {
1055             throw new UnsupportedOperationException();
1056         }
1057         public boolean remove(Object o) {
1058             throw new UnsupportedOperationException();
1059         }
1060 
1061         public boolean containsAll(Collection<?> coll) {
1062             return c.containsAll(coll);
1063         }
1064         public boolean addAll(Collection<? extends E> coll) {
1065             throw new UnsupportedOperationException();
1066         }
1067         public boolean removeAll(Collection<?> coll) {
1068             throw new UnsupportedOperationException();
1069         }
1070         public boolean retainAll(Collection<?> coll) {
1071             throw new UnsupportedOperationException();
1072         }
1073         public void clear() {
1074             throw new UnsupportedOperationException();
1075         }
1076 
1077         // Override default methods in Collection
1078         @Override
1079         public void forEach(Consumer<? super E> action) {
1080             c.forEach(action);
1081         }
1082         @Override
1083         public boolean removeIf(Predicate<? super E> filter) {
1084             throw new UnsupportedOperationException();
1085         }
1086         @SuppressWarnings("unchecked")
1087         @Override
1088         public Spliterator<E> spliterator() {
1089             return (Spliterator<E>)c.spliterator();
1090         }
1091         @SuppressWarnings("unchecked")
1092         @Override
1093         public Stream<E> stream() {
1094             return (Stream<E>)c.stream();
1095         }
1096         @SuppressWarnings("unchecked")
1097         @Override
1098         public Stream<E> parallelStream() {
1099             return (Stream<E>)c.parallelStream();
1100         }
1101     }
1102 
1103     /**
1104      * Returns an unmodifiable view of the specified set.  This method allows
1105      * modules to provide users with "read-only" access to internal sets.
1106      * Query operations on the returned set "read through" to the specified
1107      * set, and attempts to modify the returned set, whether direct or via its
1108      * iterator, result in an <tt>UnsupportedOperationException</tt>.<p>
1109      *
1110      * The returned set will be serializable if the specified set
1111      * is serializable.
1112      *
1113      * @param  <T> the class of the objects in the set
1114      * @param  s the set for which an unmodifiable view is to be returned.
1115      * @return an unmodifiable view of the specified set.
1116      */
1117     public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
1118         return new UnmodifiableSet<>(s);
1119     }
1120 
1121     /**
1122      * @serial include
1123      */
1124     static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
1125                                  implements Set<E>, Serializable {
1126         private static final long serialVersionUID = -9215047833775013803L;
1127 
1128         UnmodifiableSet(Set<? extends E> s)     {super(s);}
1129         public boolean equals(Object o) {return o == this || c.equals(o);}
1130         public int hashCode()           {return c.hashCode();}
1131     }
1132 
1133     /**
1134      * Returns an unmodifiable view of the specified sorted set.  This method
1135      * allows modules to provide users with "read-only" access to internal
1136      * sorted sets.  Query operations on the returned sorted set "read
1137      * through" to the specified sorted set.  Attempts to modify the returned
1138      * sorted set, whether direct, via its iterator, or via its
1139      * <tt>subSet</tt>, <tt>headSet</tt>, or <tt>tailSet</tt> views, result in
1140      * an <tt>UnsupportedOperationException</tt>.<p>
1141      *
1142      * The returned sorted set will be serializable if the specified sorted set
1143      * is serializable.
1144      *
1145      * @param  <T> the class of the objects in the set
1146      * @param s the sorted set for which an unmodifiable view is to be
1147      *        returned.
1148      * @return an unmodifiable view of the specified sorted set.
1149      */
1150     public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
1151         return new UnmodifiableSortedSet<>(s);
1152     }
1153 
1154     /**
1155      * @serial include
1156      */
1157     static class UnmodifiableSortedSet<E>
1158                              extends UnmodifiableSet<E>
1159                              implements SortedSet<E>, Serializable {
1160         private static final long serialVersionUID = -4929149591599911165L;
1161         private final SortedSet<E> ss;
1162 
1163         UnmodifiableSortedSet(SortedSet<E> s) {super(s); ss = s;}
1164 
1165         public Comparator<? super E> comparator() {return ss.comparator();}
1166 
1167         public SortedSet<E> subSet(E fromElement, E toElement) {
1168             return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement));
1169         }
1170         public SortedSet<E> headSet(E toElement) {
1171             return new UnmodifiableSortedSet<>(ss.headSet(toElement));
1172         }
1173         public SortedSet<E> tailSet(E fromElement) {
1174             return new UnmodifiableSortedSet<>(ss.tailSet(fromElement));
1175         }
1176 
1177         public E first()                   {return ss.first();}
1178         public E last()                    {return ss.last();}
1179     }
1180 
1181     /**
1182      * Returns an unmodifiable view of the specified navigable set.  This method
1183      * allows modules to provide users with "read-only" access to internal
1184      * navigable sets.  Query operations on the returned navigable set "read
1185      * through" to the specified navigable set.  Attempts to modify the returned
1186      * navigable set, whether direct, via its iterator, or via its
1187      * {@code subSet}, {@code headSet}, or {@code tailSet} views, result in
1188      * an {@code UnsupportedOperationException}.<p>
1189      *
1190      * The returned navigable set will be serializable if the specified
1191      * navigable set is serializable.
1192      *
1193      * @param  <T> the class of the objects in the set
1194      * @param s the navigable set for which an unmodifiable view is to be
1195      *        returned
1196      * @return an unmodifiable view of the specified navigable set
1197      * @since 1.8
1198      */
1199     public static <T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s) {
1200         return new UnmodifiableNavigableSet<>(s);
1201     }
1202 
1203     /**
1204      * Wraps a navigable set and disables all of the mutative operations.
1205      *
1206      * @param <E> type of elements
1207      * @serial include
1208      */
1209     static class UnmodifiableNavigableSet<E>
1210                              extends UnmodifiableSortedSet<E>
1211                              implements NavigableSet<E>, Serializable {
1212 
1213         private static final long serialVersionUID = -6027448201786391929L;
1214 
1215         /**
1216          * A singleton empty unmodifiable navigable set used for
1217          * {@link #emptyNavigableSet()}.
1218          *
1219          * @param <E> type of elements, if there were any, and bounds
1220          */
1221         private static class EmptyNavigableSet<E> extends UnmodifiableNavigableSet<E>
1222             implements Serializable {
1223             private static final long serialVersionUID = -6291252904449939134L;
1224 
1225             public EmptyNavigableSet() {
1226                 super(new TreeSet<>());
1227             }
1228 
1229             private Object readResolve()        { return EMPTY_NAVIGABLE_SET; }
1230         }
1231 
1232         @SuppressWarnings("rawtypes")
1233         private static final NavigableSet<?> EMPTY_NAVIGABLE_SET =
1234                 new EmptyNavigableSet<>();
1235 
1236         /**
1237          * The instance we are protecting.
1238          */
1239         private final NavigableSet<E> ns;
1240 
1241         UnmodifiableNavigableSet(NavigableSet<E> s)         {super(s); ns = s;}
1242 
1243         public E lower(E e)                             { return ns.lower(e); }
1244         public E floor(E e)                             { return ns.floor(e); }
1245         public E ceiling(E e)                         { return ns.ceiling(e); }
1246         public E higher(E e)                           { return ns.higher(e); }
1247         public E pollFirst()     { throw new UnsupportedOperationException(); }
1248         public E pollLast()      { throw new UnsupportedOperationException(); }
1249         public NavigableSet<E> descendingSet()
1250                  { return new UnmodifiableNavigableSet<>(ns.descendingSet()); }
1251         public Iterator<E> descendingIterator()
1252                                          { return descendingSet().iterator(); }
1253 
1254         public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
1255             return new UnmodifiableNavigableSet<>(
1256                 ns.subSet(fromElement, fromInclusive, toElement, toInclusive));
1257         }
1258 
1259         public NavigableSet<E> headSet(E toElement, boolean inclusive) {
1260             return new UnmodifiableNavigableSet<>(
1261                 ns.headSet(toElement, inclusive));
1262         }
1263 
1264         public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
1265             return new UnmodifiableNavigableSet<>(
1266                 ns.tailSet(fromElement, inclusive));
1267         }
1268     }
1269 
1270     /**
1271      * Returns an unmodifiable view of the specified list.  This method allows
1272      * modules to provide users with "read-only" access to internal
1273      * lists.  Query operations on the returned list "read through" to the
1274      * specified list, and attempts to modify the returned list, whether
1275      * direct or via its iterator, result in an
1276      * <tt>UnsupportedOperationException</tt>.<p>
1277      *
1278      * The returned list will be serializable if the specified list
1279      * is serializable. Similarly, the returned list will implement
1280      * {@link RandomAccess} if the specified list does.
1281      *
1282      * @param  <T> the class of the objects in the list
1283      * @param  list the list for which an unmodifiable view is to be returned.
1284      * @return an unmodifiable view of the specified list.
1285      */
1286     public static <T> List<T> unmodifiableList(List<? extends T> list) {
1287         return (list instanceof RandomAccess ?
1288                 new UnmodifiableRandomAccessList<>(list) :
1289                 new UnmodifiableList<>(list));
1290     }
1291 
1292     /**
1293      * @serial include
1294      */
1295     static class UnmodifiableList<E> extends UnmodifiableCollection<E>
1296                                   implements List<E> {
1297         private static final long serialVersionUID = -283967356065247728L;
1298 
1299         final List<? extends E> list;
1300 
1301         UnmodifiableList(List<? extends E> list) {
1302             super(list);
1303             this.list = list;
1304         }
1305 
1306         public boolean equals(Object o) {return o == this || list.equals(o);}
1307         public int hashCode()           {return list.hashCode();}
1308 
1309         public E get(int index) {return list.get(index);}
1310         public E set(int index, E element) {
1311             throw new UnsupportedOperationException();
1312         }
1313         public void add(int index, E element) {
1314             throw new UnsupportedOperationException();
1315         }
1316         public E remove(int index) {
1317             throw new UnsupportedOperationException();
1318         }
1319         public int indexOf(Object o)            {return list.indexOf(o);}
1320         public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}
1321         public boolean addAll(int index, Collection<? extends E> c) {
1322             throw new UnsupportedOperationException();
1323         }
1324 
1325         @Override
1326         public void replaceAll(UnaryOperator<E> operator) {
1327             throw new UnsupportedOperationException();
1328         }
1329         @Override
1330         public void sort(Comparator<? super E> c) {
1331             throw new UnsupportedOperationException();
1332         }
1333 
1334         public ListIterator<E> listIterator()   {return listIterator(0);}
1335 
1336         public ListIterator<E> listIterator(final int index) {
1337             return new ListIterator<E>() {
1338                 private final ListIterator<? extends E> i
1339                     = list.listIterator(index);
1340 
1341                 public boolean hasNext()     {return i.hasNext();}
1342                 public E next()              {return i.next();}
1343                 public boolean hasPrevious() {return i.hasPrevious();}
1344                 public E previous()          {return i.previous();}
1345                 public int nextIndex()       {return i.nextIndex();}
1346                 public int previousIndex()   {return i.previousIndex();}
1347 
1348                 public void remove() {
1349                     throw new UnsupportedOperationException();
1350                 }
1351                 public void set(E e) {
1352                     throw new UnsupportedOperationException();
1353                 }
1354                 public void add(E e) {
1355                     throw new UnsupportedOperationException();
1356                 }
1357 
1358                 @Override
1359                 public void forEachRemaining(Consumer<? super E> action) {
1360                     i.forEachRemaining(action);
1361                 }
1362             };
1363         }
1364 
1365         public List<E> subList(int fromIndex, int toIndex) {
1366             return new UnmodifiableList<>(list.subList(fromIndex, toIndex));
1367         }
1368 
1369         /**
1370          * UnmodifiableRandomAccessList instances are serialized as
1371          * UnmodifiableList instances to allow them to be deserialized
1372          * in pre-1.4 JREs (which do not have UnmodifiableRandomAccessList).
1373          * This method inverts the transformation.  As a beneficial
1374          * side-effect, it also grafts the RandomAccess marker onto
1375          * UnmodifiableList instances that were serialized in pre-1.4 JREs.
1376          *
1377          * Note: Unfortunately, UnmodifiableRandomAccessList instances
1378          * serialized in 1.4.1 and deserialized in 1.4 will become
1379          * UnmodifiableList instances, as this method was missing in 1.4.
1380          */
1381         private Object readResolve() {
1382             return (list instanceof RandomAccess
1383                     ? new UnmodifiableRandomAccessList<>(list)
1384                     : this);
1385         }
1386     }
1387 
1388     /**
1389      * @serial include
1390      */
1391     static class UnmodifiableRandomAccessList<E> extends UnmodifiableList<E>
1392                                               implements RandomAccess
1393     {
1394         UnmodifiableRandomAccessList(List<? extends E> list) {
1395             super(list);
1396         }
1397 
1398         public List<E> subList(int fromIndex, int toIndex) {
1399             return new UnmodifiableRandomAccessList<>(
1400                 list.subList(fromIndex, toIndex));
1401         }
1402 
1403         private static final long serialVersionUID = -2542308836966382001L;
1404 
1405         /**
1406          * Allows instances to be deserialized in pre-1.4 JREs (which do
1407          * not have UnmodifiableRandomAccessList).  UnmodifiableList has
1408          * a readResolve method that inverts this transformation upon
1409          * deserialization.
1410          */
1411         private Object writeReplace() {
1412             return new UnmodifiableList<>(list);
1413         }
1414     }
1415 
1416     /**
1417      * Returns an unmodifiable view of the specified map.  This method
1418      * allows modules to provide users with "read-only" access to internal
1419      * maps.  Query operations on the returned map "read through"
1420      * to the specified map, and attempts to modify the returned
1421      * map, whether direct or via its collection views, result in an
1422      * <tt>UnsupportedOperationException</tt>.<p>
1423      *
1424      * The returned map will be serializable if the specified map
1425      * is serializable.
1426      *
1427      * @param <K> the class of the map keys
1428      * @param <V> the class of the map values
1429      * @param  m the map for which an unmodifiable view is to be returned.
1430      * @return an unmodifiable view of the specified map.
1431      */
1432     public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
1433         return new UnmodifiableMap<>(m);
1434     }
1435 
1436     /**
1437      * @serial include
1438      */
1439     private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
1440         private static final long serialVersionUID = -1034234728574286014L;
1441 
1442         private final Map<? extends K, ? extends V> m;
1443 
1444         UnmodifiableMap(Map<? extends K, ? extends V> m) {
1445             if (m==null)
1446                 throw new NullPointerException();
1447             this.m = m;
1448         }
1449 
1450         public int size()                        {return m.size();}
1451         public boolean isEmpty()                 {return m.isEmpty();}
1452         public boolean containsKey(Object key)   {return m.containsKey(key);}
1453         public boolean containsValue(Object val) {return m.containsValue(val);}
1454         public V get(Object key)                 {return m.get(key);}
1455 
1456         public V put(K key, V value) {
1457             throw new UnsupportedOperationException();
1458         }
1459         public V remove(Object key) {
1460             throw new UnsupportedOperationException();
1461         }
1462         public void putAll(Map<? extends K, ? extends V> m) {
1463             throw new UnsupportedOperationException();
1464         }
1465         public void clear() {
1466             throw new UnsupportedOperationException();
1467         }
1468 
1469         private transient Set<K> keySet;
1470         private transient Set<Map.Entry<K,V>> entrySet;
1471         private transient Collection<V> values;
1472 
1473         public Set<K> keySet() {
1474             if (keySet==null)
1475                 keySet = unmodifiableSet(m.keySet());
1476             return keySet;
1477         }
1478 
1479         public Set<Map.Entry<K,V>> entrySet() {
1480             if (entrySet==null)
1481                 entrySet = new UnmodifiableEntrySet<>(m.entrySet());
1482             return entrySet;
1483         }
1484 
1485         public Collection<V> values() {
1486             if (values==null)
1487                 values = unmodifiableCollection(m.values());
1488             return values;
1489         }
1490 
1491         public boolean equals(Object o) {return o == this || m.equals(o);}
1492         public int hashCode()           {return m.hashCode();}
1493         public String toString()        {return m.toString();}
1494 
1495         // Override default methods in Map
1496         @Override
1497         @SuppressWarnings("unchecked")
1498         public V getOrDefault(Object k, V defaultValue) {
1499             // Safe cast as we don't change the value
1500             return ((Map<K, V>)m).getOrDefault(k, defaultValue);
1501         }
1502 
1503         @Override
1504         public void forEach(BiConsumer<? super K, ? super V> action) {
1505             m.forEach(action);
1506         }
1507 
1508         @Override
1509         public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
1510             throw new UnsupportedOperationException();
1511         }
1512 
1513         @Override
1514         public V putIfAbsent(K key, V value) {
1515             throw new UnsupportedOperationException();
1516         }
1517 
1518         @Override
1519         public boolean remove(Object key, Object value) {
1520             throw new UnsupportedOperationException();
1521         }
1522 
1523         @Override
1524         public boolean replace(K key, V oldValue, V newValue) {
1525             throw new UnsupportedOperationException();
1526         }
1527 
1528         @Override
1529         public V replace(K key, V value) {
1530             throw new UnsupportedOperationException();
1531         }
1532 
1533         @Override
1534         public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
1535             throw new UnsupportedOperationException();
1536         }
1537 
1538         @Override
1539         public V computeIfPresent(K key,
1540                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
1541             throw new UnsupportedOperationException();
1542         }
1543 
1544         @Override
1545         public V compute(K key,
1546                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
1547             throw new UnsupportedOperationException();
1548         }
1549 
1550         @Override
1551         public V merge(K key, V value,
1552                 BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
1553             throw new UnsupportedOperationException();
1554         }
1555 
1556         /**
1557          * We need this class in addition to UnmodifiableSet as
1558          * Map.Entries themselves permit modification of the backing Map
1559          * via their setValue operation.  This class is subtle: there are
1560          * many possible attacks that must be thwarted.
1561          *
1562          * @serial include
1563          */
1564         static class UnmodifiableEntrySet<K,V>
1565             extends UnmodifiableSet<Map.Entry<K,V>> {
1566             private static final long serialVersionUID = 7854390611657943733L;
1567 
1568             @SuppressWarnings({"unchecked", "rawtypes"})
1569             UnmodifiableEntrySet(Set<? extends Map.Entry<? extends K, ? extends V>> s) {
1570                 // Need to cast to raw in order to work around a limitation in the type system
1571                 super((Set)s);
1572             }
1573 
1574             static <K, V> Consumer<Map.Entry<K, V>> entryConsumer(Consumer<? super Entry<K, V>> action) {
1575                 return e -> action.accept(new UnmodifiableEntry<>(e));
1576             }
1577 
1578             public void forEach(Consumer<? super Entry<K, V>> action) {
1579                 Objects.requireNonNull(action);
1580                 c.forEach(entryConsumer(action));
1581             }
1582 
1583             static final class UnmodifiableEntrySetSpliterator<K, V>
1584                     implements Spliterator<Entry<K,V>> {
1585                 final Spliterator<Map.Entry<K, V>> s;
1586 
1587                 UnmodifiableEntrySetSpliterator(Spliterator<Entry<K, V>> s) {
1588                     this.s = s;
1589                 }
1590 
1591                 @Override
1592                 public boolean tryAdvance(Consumer<? super Entry<K, V>> action) {
1593                     Objects.requireNonNull(action);
1594                     return s.tryAdvance(entryConsumer(action));
1595                 }
1596 
1597                 @Override
1598                 public void forEachRemaining(Consumer<? super Entry<K, V>> action) {
1599                     Objects.requireNonNull(action);
1600                     s.forEachRemaining(entryConsumer(action));
1601                 }
1602 
1603                 @Override
1604                 public Spliterator<Entry<K, V>> trySplit() {
1605                     Spliterator<Entry<K, V>> split = s.trySplit();
1606                     return split == null
1607                            ? null
1608                            : new UnmodifiableEntrySetSpliterator<>(split);
1609                 }
1610 
1611                 @Override
1612                 public long estimateSize() {
1613                     return s.estimateSize();
1614                 }
1615 
1616                 @Override
1617                 public long getExactSizeIfKnown() {
1618                     return s.getExactSizeIfKnown();
1619                 }
1620 
1621                 @Override
1622                 public int characteristics() {
1623                     return s.characteristics();
1624                 }
1625 
1626                 @Override
1627                 public boolean hasCharacteristics(int characteristics) {
1628                     return s.hasCharacteristics(characteristics);
1629                 }
1630 
1631                 @Override
1632                 public Comparator<? super Entry<K, V>> getComparator() {
1633                     return s.getComparator();
1634                 }
1635             }
1636 
1637             @SuppressWarnings("unchecked")
1638             public Spliterator<Entry<K,V>> spliterator() {
1639                 return new UnmodifiableEntrySetSpliterator<>(
1640                         (Spliterator<Map.Entry<K, V>>) c.spliterator());
1641             }
1642 
1643             @Override
1644             public Stream<Entry<K,V>> stream() {
1645                 return StreamSupport.stream(spliterator(), false);
1646             }
1647 
1648             @Override
1649             public Stream<Entry<K,V>> parallelStream() {
1650                 return StreamSupport.stream(spliterator(), true);
1651             }
1652 
1653             public Iterator<Map.Entry<K,V>> iterator() {
1654                 return new Iterator<Map.Entry<K,V>>() {
1655                     private final Iterator<? extends Map.Entry<? extends K, ? extends V>> i = c.iterator();
1656 
1657                     public boolean hasNext() {
1658                         return i.hasNext();
1659                     }
1660                     public Map.Entry<K,V> next() {
1661                         return new UnmodifiableEntry<>(i.next());
1662                     }
1663                     public void remove() {
1664                         throw new UnsupportedOperationException();
1665                     }
1666                 };
1667             }
1668 
1669             @SuppressWarnings("unchecked")
1670             public Object[] toArray() {
1671                 Object[] a = c.toArray();
1672                 for (int i=0; i<a.length; i++)
1673                     a[i] = new UnmodifiableEntry<>((Map.Entry<? extends K, ? extends V>)a[i]);
1674                 return a;
1675             }
1676 
1677             @SuppressWarnings("unchecked")
1678             public <T> T[] toArray(T[] a) {
1679                 // We don't pass a to c.toArray, to avoid window of
1680                 // vulnerability wherein an unscrupulous multithreaded client
1681                 // could get his hands on raw (unwrapped) Entries from c.
1682                 Object[] arr = c.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
1683 
1684                 for (int i=0; i<arr.length; i++)
1685                     arr[i] = new UnmodifiableEntry<>((Map.Entry<? extends K, ? extends V>)arr[i]);
1686 
1687                 if (arr.length > a.length)
1688                     return (T[])arr;
1689 
1690                 System.arraycopy(arr, 0, a, 0, arr.length);
1691                 if (a.length > arr.length)
1692                     a[arr.length] = null;
1693                 return a;
1694             }
1695 
1696             /**
1697              * This method is overridden to protect the backing set against
1698              * an object with a nefarious equals function that senses
1699              * that the equality-candidate is Map.Entry and calls its
1700              * setValue method.
1701              */
1702             public boolean contains(Object o) {
1703                 if (!(o instanceof Map.Entry))
1704                     return false;
1705                 return c.contains(
1706                     new UnmodifiableEntry<>((Map.Entry<?,?>) o));
1707             }
1708 
1709             /**
1710              * The next two methods are overridden to protect against
1711              * an unscrupulous List whose contains(Object o) method senses
1712              * when o is a Map.Entry, and calls o.setValue.
1713              */
1714             public boolean containsAll(Collection<?> coll) {
1715                 for (Object e : coll) {
1716                     if (!contains(e)) // Invokes safe contains() above
1717                         return false;
1718                 }
1719                 return true;
1720             }
1721             public boolean equals(Object o) {
1722                 if (o == this)
1723                     return true;
1724 
1725                 if (!(o instanceof Set))
1726                     return false;
1727                 Set<?> s = (Set<?>) o;
1728                 if (s.size() != c.size())
1729                     return false;
1730                 return containsAll(s); // Invokes safe containsAll() above
1731             }
1732 
1733             /**
1734              * This "wrapper class" serves two purposes: it prevents
1735              * the client from modifying the backing Map, by short-circuiting
1736              * the setValue method, and it protects the backing Map against
1737              * an ill-behaved Map.Entry that attempts to modify another
1738              * Map Entry when asked to perform an equality check.
1739              */
1740             private static class UnmodifiableEntry<K,V> implements Map.Entry<K,V> {
1741                 private Map.Entry<? extends K, ? extends V> e;
1742 
1743                 UnmodifiableEntry(Map.Entry<? extends K, ? extends V> e)
1744                         {this.e = Objects.requireNonNull(e);}
1745 
1746                 public K getKey()        {return e.getKey();}
1747                 public V getValue()      {return e.getValue();}
1748                 public V setValue(V value) {
1749                     throw new UnsupportedOperationException();
1750                 }
1751                 public int hashCode()    {return e.hashCode();}
1752                 public boolean equals(Object o) {
1753                     if (this == o)
1754                         return true;
1755                     if (!(o instanceof Map.Entry))
1756                         return false;
1757                     Map.Entry<?,?> t = (Map.Entry<?,?>)o;
1758                     return eq(e.getKey(),   t.getKey()) &&
1759                            eq(e.getValue(), t.getValue());
1760                 }
1761                 public String toString() {return e.toString();}
1762             }
1763         }
1764     }
1765 
1766     /**
1767      * Returns an unmodifiable view of the specified sorted map.  This method
1768      * allows modules to provide users with "read-only" access to internal
1769      * sorted maps.  Query operations on the returned sorted map "read through"
1770      * to the specified sorted map.  Attempts to modify the returned
1771      * sorted map, whether direct, via its collection views, or via its
1772      * <tt>subMap</tt>, <tt>headMap</tt>, or <tt>tailMap</tt> views, result in
1773      * an <tt>UnsupportedOperationException</tt>.<p>
1774      *
1775      * The returned sorted map will be serializable if the specified sorted map
1776      * is serializable.
1777      *
1778      * @param <K> the class of the map keys
1779      * @param <V> the class of the map values
1780      * @param m the sorted map for which an unmodifiable view is to be
1781      *        returned.
1782      * @return an unmodifiable view of the specified sorted map.
1783      */
1784     public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m) {
1785         return new UnmodifiableSortedMap<>(m);
1786     }
1787 
1788     /**
1789      * @serial include
1790      */
1791     static class UnmodifiableSortedMap<K,V>
1792           extends UnmodifiableMap<K,V>
1793           implements SortedMap<K,V>, Serializable {
1794         private static final long serialVersionUID = -8806743815996713206L;
1795 
1796         private final SortedMap<K, ? extends V> sm;
1797 
1798         UnmodifiableSortedMap(SortedMap<K, ? extends V> m) {super(m); sm = m; }
1799         public Comparator<? super K> comparator()   { return sm.comparator(); }
1800         public SortedMap<K,V> subMap(K fromKey, K toKey)
1801              { return new UnmodifiableSortedMap<>(sm.subMap(fromKey, toKey)); }
1802         public SortedMap<K,V> headMap(K toKey)
1803                      { return new UnmodifiableSortedMap<>(sm.headMap(toKey)); }
1804         public SortedMap<K,V> tailMap(K fromKey)
1805                    { return new UnmodifiableSortedMap<>(sm.tailMap(fromKey)); }
1806         public K firstKey()                           { return sm.firstKey(); }
1807         public K lastKey()                             { return sm.lastKey(); }
1808     }
1809 
1810     /**
1811      * Returns an unmodifiable view of the specified navigable map.  This method
1812      * allows modules to provide users with "read-only" access to internal
1813      * navigable maps.  Query operations on the returned navigable map "read
1814      * through" to the specified navigable map.  Attempts to modify the returned
1815      * navigable map, whether direct, via its collection views, or via its
1816      * {@code subMap}, {@code headMap}, or {@code tailMap} views, result in
1817      * an {@code UnsupportedOperationException}.<p>
1818      *
1819      * The returned navigable map will be serializable if the specified
1820      * navigable map is serializable.
1821      *
1822      * @param <K> the class of the map keys
1823      * @param <V> the class of the map values
1824      * @param m the navigable map for which an unmodifiable view is to be
1825      *        returned
1826      * @return an unmodifiable view of the specified navigable map
1827      * @since 1.8
1828      */
1829     public static <K,V> NavigableMap<K,V> unmodifiableNavigableMap(NavigableMap<K, ? extends V> m) {
1830         return new UnmodifiableNavigableMap<>(m);
1831     }
1832 
1833     /**
1834      * @serial include
1835      */
1836     static class UnmodifiableNavigableMap<K,V>
1837           extends UnmodifiableSortedMap<K,V>
1838           implements NavigableMap<K,V>, Serializable {
1839         private static final long serialVersionUID = -4858195264774772197L;
1840 
1841         /**
1842          * A class for the {@link EMPTY_NAVIGABLE_MAP} which needs readResolve
1843          * to preserve singleton property.
1844          *
1845          * @param <K> type of keys, if there were any, and of bounds
1846          * @param <V> type of values, if there were any
1847          */
1848         private static class EmptyNavigableMap<K,V> extends UnmodifiableNavigableMap<K,V>
1849             implements Serializable {
1850 
1851             private static final long serialVersionUID = -2239321462712562324L;
1852 
1853             EmptyNavigableMap()                       { super(new TreeMap<>()); }
1854 
1855             @Override
1856             public NavigableSet<K> navigableKeySet()
1857                                                 { return emptyNavigableSet(); }
1858 
1859             private Object readResolve()        { return EMPTY_NAVIGABLE_MAP; }
1860         }
1861 
1862         /**
1863          * Singleton for {@link emptyNavigableMap()} which is also immutable.
1864          */
1865         private static final EmptyNavigableMap<?,?> EMPTY_NAVIGABLE_MAP =
1866             new EmptyNavigableMap<>();
1867 
1868         /**
1869          * The instance we wrap and protect.
1870          */
1871         private final NavigableMap<K, ? extends V> nm;
1872 
1873         UnmodifiableNavigableMap(NavigableMap<K, ? extends V> m)
1874                                                             {super(m); nm = m;}
1875 
1876         public K lowerKey(K key)                   { return nm.lowerKey(key); }
1877         public K floorKey(K key)                   { return nm.floorKey(key); }
1878         public K ceilingKey(K key)               { return nm.ceilingKey(key); }
1879         public K higherKey(K key)                 { return nm.higherKey(key); }
1880 
1881         @SuppressWarnings("unchecked")
1882         public Entry<K, V> lowerEntry(K key) {
1883             Entry<K,V> lower = (Entry<K, V>) nm.lowerEntry(key);
1884             return (null != lower)
1885                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(lower)
1886                 : null;
1887         }
1888 
1889         @SuppressWarnings("unchecked")
1890         public Entry<K, V> floorEntry(K key) {
1891             Entry<K,V> floor = (Entry<K, V>) nm.floorEntry(key);
1892             return (null != floor)
1893                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(floor)
1894                 : null;
1895         }
1896 
1897         @SuppressWarnings("unchecked")
1898         public Entry<K, V> ceilingEntry(K key) {
1899             Entry<K,V> ceiling = (Entry<K, V>) nm.ceilingEntry(key);
1900             return (null != ceiling)
1901                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(ceiling)
1902                 : null;
1903         }
1904 
1905 
1906         @SuppressWarnings("unchecked")
1907         public Entry<K, V> higherEntry(K key) {
1908             Entry<K,V> higher = (Entry<K, V>) nm.higherEntry(key);
1909             return (null != higher)
1910                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(higher)
1911                 : null;
1912         }
1913 
1914         @SuppressWarnings("unchecked")
1915         public Entry<K, V> firstEntry() {
1916             Entry<K,V> first = (Entry<K, V>) nm.firstEntry();
1917             return (null != first)
1918                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(first)
1919                 : null;
1920         }
1921 
1922         @SuppressWarnings("unchecked")
1923         public Entry<K, V> lastEntry() {
1924             Entry<K,V> last = (Entry<K, V>) nm.lastEntry();
1925             return (null != last)
1926                 ? new UnmodifiableEntrySet.UnmodifiableEntry<>(last)
1927                 : null;
1928         }
1929 
1930         public Entry<K, V> pollFirstEntry()
1931                                  { throw new UnsupportedOperationException(); }
1932         public Entry<K, V> pollLastEntry()
1933                                  { throw new UnsupportedOperationException(); }
1934         public NavigableMap<K, V> descendingMap()
1935                        { return unmodifiableNavigableMap(nm.descendingMap()); }
1936         public NavigableSet<K> navigableKeySet()
1937                      { return unmodifiableNavigableSet(nm.navigableKeySet()); }
1938         public NavigableSet<K> descendingKeySet()
1939                     { return unmodifiableNavigableSet(nm.descendingKeySet()); }
1940 
1941         public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
1942             return unmodifiableNavigableMap(
1943                 nm.subMap(fromKey, fromInclusive, toKey, toInclusive));
1944         }
1945 
1946         public NavigableMap<K, V> headMap(K toKey, boolean inclusive)
1947              { return unmodifiableNavigableMap(nm.headMap(toKey, inclusive)); }
1948         public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
1949            { return unmodifiableNavigableMap(nm.tailMap(fromKey, inclusive)); }
1950     }
1951 
1952     // Synch Wrappers
1953 
1954     /**
1955      * Returns a synchronized (thread-safe) collection backed by the specified
1956      * collection.  In order to guarantee serial access, it is critical that
1957      * <strong>all</strong> access to the backing collection is accomplished
1958      * through the returned collection.<p>
1959      *
1960      * It is imperative that the user manually synchronize on the returned
1961      * collection when traversing it via {@link Iterator}, {@link Spliterator}
1962      * or {@link Stream}:
1963      * <pre>
1964      *  Collection c = Collections.synchronizedCollection(myCollection);
1965      *     ...
1966      *  synchronized (c) {
1967      *      Iterator i = c.iterator(); // Must be in the synchronized block
1968      *      while (i.hasNext())
1969      *         foo(i.next());
1970      *  }
1971      * </pre>
1972      * Failure to follow this advice may result in non-deterministic behavior.
1973      *
1974      * <p>The returned collection does <i>not</i> pass the {@code hashCode}
1975      * and {@code equals} operations through to the backing collection, but
1976      * relies on {@code Object}'s equals and hashCode methods.  This is
1977      * necessary to preserve the contracts of these operations in the case
1978      * that the backing collection is a set or a list.<p>
1979      *
1980      * The returned collection will be serializable if the specified collection
1981      * is serializable.
1982      *
1983      * @param  <T> the class of the objects in the collection
1984      * @param  c the collection to be "wrapped" in a synchronized collection.
1985      * @return a synchronized view of the specified collection.
1986      */
1987     public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
1988         return new SynchronizedCollection<>(c);
1989     }
1990 
1991     static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
1992         return new SynchronizedCollection<>(c, mutex);
1993     }
1994 
1995     /**
1996      * @serial include
1997      */
1998     static class SynchronizedCollection<E> implements Collection<E>, Serializable {
1999         private static final long serialVersionUID = 3053995032091335093L;
2000 
2001         final Collection<E> c;  // Backing Collection
2002         final Object mutex;     // Object on which to synchronize
2003 
2004         SynchronizedCollection(Collection<E> c) {
2005             this.c = Objects.requireNonNull(c);
2006             mutex = this;
2007         }
2008 
2009         SynchronizedCollection(Collection<E> c, Object mutex) {
2010             this.c = Objects.requireNonNull(c);
2011             this.mutex = Objects.requireNonNull(mutex);
2012         }
2013 
2014         public int size() {
2015             synchronized (mutex) {return c.size();}
2016         }
2017         public boolean isEmpty() {
2018             synchronized (mutex) {return c.isEmpty();}
2019         }
2020         public boolean contains(Object o) {
2021             synchronized (mutex) {return c.contains(o);}
2022         }
2023         public Object[] toArray() {
2024             synchronized (mutex) {return c.toArray();}
2025         }
2026         public <T> T[] toArray(T[] a) {
2027             synchronized (mutex) {return c.toArray(a);}
2028         }
2029 
2030         public Iterator<E> iterator() {
2031             return c.iterator(); // Must be manually synched by user!
2032         }
2033 
2034         public boolean add(E e) {
2035             synchronized (mutex) {return c.add(e);}
2036         }
2037         public boolean remove(Object o) {
2038             synchronized (mutex) {return c.remove(o);}
2039         }
2040 
2041         public boolean containsAll(Collection<?> coll) {
2042             synchronized (mutex) {return c.containsAll(coll);}
2043         }
2044         public boolean addAll(Collection<? extends E> coll) {
2045             synchronized (mutex) {return c.addAll(coll);}
2046         }
2047         public boolean removeAll(Collection<?> coll) {
2048             synchronized (mutex) {return c.removeAll(coll);}
2049         }
2050         public boolean retainAll(Collection<?> coll) {
2051             synchronized (mutex) {return c.retainAll(coll);}
2052         }
2053         public void clear() {
2054             synchronized (mutex) {c.clear();}
2055         }
2056         public String toString() {
2057             synchronized (mutex) {return c.toString();}
2058         }
2059         // Override default methods in Collection
2060         @Override
2061         public void forEach(Consumer<? super E> consumer) {
2062             synchronized (mutex) {c.forEach(consumer);}
2063         }
2064         @Override
2065         public boolean removeIf(Predicate<? super E> filter) {
2066             synchronized (mutex) {return c.removeIf(filter);}
2067         }
2068         @Override
2069         public Spliterator<E> spliterator() {
2070             return c.spliterator(); // Must be manually synched by user!
2071         }
2072         @Override
2073         public Stream<E> stream() {
2074             return c.stream(); // Must be manually synched by user!
2075         }
2076         @Override
2077         public Stream<E> parallelStream() {
2078             return c.parallelStream(); // Must be manually synched by user!
2079         }
2080         private void writeObject(ObjectOutputStream s) throws IOException {
2081             synchronized (mutex) {s.defaultWriteObject();}
2082         }
2083     }
2084 
2085     /**
2086      * Returns a synchronized (thread-safe) set backed by the specified
2087      * set.  In order to guarantee serial access, it is critical that
2088      * <strong>all</strong> access to the backing set is accomplished
2089      * through the returned set.<p>
2090      *
2091      * It is imperative that the user manually synchronize on the returned
2092      * set when iterating over it:
2093      * <pre>
2094      *  Set s = Collections.synchronizedSet(new HashSet());
2095      *      ...
2096      *  synchronized (s) {
2097      *      Iterator i = s.iterator(); // Must be in the synchronized block
2098      *      while (i.hasNext())
2099      *          foo(i.next());
2100      *  }
2101      * </pre>
2102      * Failure to follow this advice may result in non-deterministic behavior.
2103      *
2104      * <p>The returned set will be serializable if the specified set is
2105      * serializable.
2106      *
2107      * @param  <T> the class of the objects in the set
2108      * @param  s the set to be "wrapped" in a synchronized set.
2109      * @return a synchronized view of the specified set.
2110      */
2111     public static <T> Set<T> synchronizedSet(Set<T> s) {
2112         return new SynchronizedSet<>(s);
2113     }
2114 
2115     static <T> Set<T> synchronizedSet(Set<T> s, Object mutex) {
2116         return new SynchronizedSet<>(s, mutex);
2117     }
2118 
2119     /**
2120      * @serial include
2121      */
2122     static class SynchronizedSet<E>
2123           extends SynchronizedCollection<E>
2124           implements Set<E> {
2125         private static final long serialVersionUID = 487447009682186044L;
2126 
2127         SynchronizedSet(Set<E> s) {
2128             super(s);
2129         }
2130         SynchronizedSet(Set<E> s, Object mutex) {
2131             super(s, mutex);
2132         }
2133 
2134         public boolean equals(Object o) {
2135             if (this == o)
2136                 return true;
2137             synchronized (mutex) {return c.equals(o);}
2138         }
2139         public int hashCode() {
2140             synchronized (mutex) {return c.hashCode();}
2141         }
2142     }
2143 
2144     /**
2145      * Returns a synchronized (thread-safe) sorted set backed by the specified
2146      * sorted set.  In order to guarantee serial access, it is critical that
2147      * <strong>all</strong> access to the backing sorted set is accomplished
2148      * through the returned sorted set (or its views).<p>
2149      *
2150      * It is imperative that the user manually synchronize on the returned
2151      * sorted set when iterating over it or any of its <tt>subSet</tt>,
2152      * <tt>headSet</tt>, or <tt>tailSet</tt> views.
2153      * <pre>
2154      *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
2155      *      ...
2156      *  synchronized (s) {
2157      *      Iterator i = s.iterator(); // Must be in the synchronized block
2158      *      while (i.hasNext())
2159      *          foo(i.next());
2160      *  }
2161      * </pre>
2162      * or:
2163      * <pre>
2164      *  SortedSet s = Collections.synchronizedSortedSet(new TreeSet());
2165      *  SortedSet s2 = s.headSet(foo);
2166      *      ...
2167      *  synchronized (s) {  // Note: s, not s2!!!
2168      *      Iterator i = s2.iterator(); // Must be in the synchronized block
2169      *      while (i.hasNext())
2170      *          foo(i.next());
2171      *  }
2172      * </pre>
2173      * Failure to follow this advice may result in non-deterministic behavior.
2174      *
2175      * <p>The returned sorted set will be serializable if the specified
2176      * sorted set is serializable.
2177      *
2178      * @param  <T> the class of the objects in the set
2179      * @param  s the sorted set to be "wrapped" in a synchronized sorted set.
2180      * @return a synchronized view of the specified sorted set.
2181      */
2182     public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s) {
2183         return new SynchronizedSortedSet<>(s);
2184     }
2185 
2186     /**
2187      * @serial include
2188      */
2189     static class SynchronizedSortedSet<E>
2190         extends SynchronizedSet<E>
2191         implements SortedSet<E>
2192     {
2193         private static final long serialVersionUID = 8695801310862127406L;
2194 
2195         private final SortedSet<E> ss;
2196 
2197         SynchronizedSortedSet(SortedSet<E> s) {
2198             super(s);
2199             ss = s;
2200         }
2201         SynchronizedSortedSet(SortedSet<E> s, Object mutex) {
2202             super(s, mutex);
2203             ss = s;
2204         }
2205 
2206         public Comparator<? super E> comparator() {
2207             synchronized (mutex) {return ss.comparator();}
2208         }
2209 
2210         public SortedSet<E> subSet(E fromElement, E toElement) {
2211             synchronized (mutex) {
2212                 return new SynchronizedSortedSet<>(
2213                     ss.subSet(fromElement, toElement), mutex);
2214             }
2215         }
2216         public SortedSet<E> headSet(E toElement) {
2217             synchronized (mutex) {
2218                 return new SynchronizedSortedSet<>(ss.headSet(toElement), mutex);
2219             }
2220         }
2221         public SortedSet<E> tailSet(E fromElement) {
2222             synchronized (mutex) {
2223                return new SynchronizedSortedSet<>(ss.tailSet(fromElement),mutex);
2224             }
2225         }
2226 
2227         public E first() {
2228             synchronized (mutex) {return ss.first();}
2229         }
2230         public E last() {
2231             synchronized (mutex) {return ss.last();}
2232         }
2233     }
2234 
2235     /**
2236      * Returns a synchronized (thread-safe) navigable set backed by the
2237      * specified navigable set.  In order to guarantee serial access, it is
2238      * critical that <strong>all</strong> access to the backing navigable set is
2239      * accomplished through the returned navigable set (or its views).<p>
2240      *
2241      * It is imperative that the user manually synchronize on the returned
2242      * navigable set when iterating over it or any of its {@code subSet},
2243      * {@code headSet}, or {@code tailSet} views.
2244      * <pre>
2245      *  NavigableSet s = Collections.synchronizedNavigableSet(new TreeSet());
2246      *      ...
2247      *  synchronized (s) {
2248      *      Iterator i = s.iterator(); // Must be in the synchronized block
2249      *      while (i.hasNext())
2250      *          foo(i.next());
2251      *  }
2252      * </pre>
2253      * or:
2254      * <pre>
2255      *  NavigableSet s = Collections.synchronizedNavigableSet(new TreeSet());
2256      *  NavigableSet s2 = s.headSet(foo, true);
2257      *      ...
2258      *  synchronized (s) {  // Note: s, not s2!!!
2259      *      Iterator i = s2.iterator(); // Must be in the synchronized block
2260      *      while (i.hasNext())
2261      *          foo(i.next());
2262      *  }
2263      * </pre>
2264      * Failure to follow this advice may result in non-deterministic behavior.
2265      *
2266      * <p>The returned navigable set will be serializable if the specified
2267      * navigable set is serializable.
2268      *
2269      * @param  <T> the class of the objects in the set
2270      * @param  s the navigable set to be "wrapped" in a synchronized navigable
2271      * set
2272      * @return a synchronized view of the specified navigable set
2273      * @since 1.8
2274      */
2275     public static <T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s) {
2276         return new SynchronizedNavigableSet<>(s);
2277     }
2278 
2279     /**
2280      * @serial include
2281      */
2282     static class SynchronizedNavigableSet<E>
2283         extends SynchronizedSortedSet<E>
2284         implements NavigableSet<E>
2285     {
2286         private static final long serialVersionUID = -5505529816273629798L;
2287 
2288         private final NavigableSet<E> ns;
2289 
2290         SynchronizedNavigableSet(NavigableSet<E> s) {
2291             super(s);
2292             ns = s;
2293         }
2294 
2295         SynchronizedNavigableSet(NavigableSet<E> s, Object mutex) {
2296             super(s, mutex);
2297             ns = s;
2298         }
2299         public E lower(E e)      { synchronized (mutex) {return ns.lower(e);} }
2300         public E floor(E e)      { synchronized (mutex) {return ns.floor(e);} }
2301         public E ceiling(E e)  { synchronized (mutex) {return ns.ceiling(e);} }
2302         public E higher(E e)    { synchronized (mutex) {return ns.higher(e);} }
2303         public E pollFirst()  { synchronized (mutex) {return ns.pollFirst();} }
2304         public E pollLast()    { synchronized (mutex) {return ns.pollLast();} }
2305 
2306         public NavigableSet<E> descendingSet() {
2307             synchronized (mutex) {
2308                 return new SynchronizedNavigableSet<>(ns.descendingSet(), mutex);
2309             }
2310         }
2311 
2312         public Iterator<E> descendingIterator()
2313                  { synchronized (mutex) { return descendingSet().iterator(); } }
2314 
2315         public NavigableSet<E> subSet(E fromElement, E toElement) {
2316             synchronized (mutex) {
2317                 return new SynchronizedNavigableSet<>(ns.subSet(fromElement, true, toElement, false), mutex);
2318             }
2319         }
2320         public NavigableSet<E> headSet(E toElement) {
2321             synchronized (mutex) {
2322                 return new SynchronizedNavigableSet<>(ns.headSet(toElement, false), mutex);
2323             }
2324         }
2325         public NavigableSet<E> tailSet(E fromElement) {
2326             synchronized (mutex) {
2327                 return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, true), mutex);
2328             }
2329         }
2330 
2331         public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
2332             synchronized (mutex) {
2333                 return new SynchronizedNavigableSet<>(ns.subSet(fromElement, fromInclusive, toElement, toInclusive), mutex);
2334             }
2335         }
2336 
2337         public NavigableSet<E> headSet(E toElement, boolean inclusive) {
2338             synchronized (mutex) {
2339                 return new SynchronizedNavigableSet<>(ns.headSet(toElement, inclusive), mutex);
2340             }
2341         }
2342 
2343         public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
2344             synchronized (mutex) {
2345                 return new SynchronizedNavigableSet<>(ns.tailSet(fromElement, inclusive));
2346             }
2347         }
2348     }
2349 
2350     /**
2351      * Returns a synchronized (thread-safe) list backed by the specified
2352      * list.  In order to guarantee serial access, it is critical that
2353      * <strong>all</strong> access to the backing list is accomplished
2354      * through the returned list.<p>
2355      *
2356      * It is imperative that the user manually synchronize on the returned
2357      * list when iterating over it:
2358      * <pre>
2359      *  List list = Collections.synchronizedList(new ArrayList());
2360      *      ...
2361      *  synchronized (list) {
2362      *      Iterator i = list.iterator(); // Must be in synchronized block
2363      *      while (i.hasNext())
2364      *          foo(i.next());
2365      *  }
2366      * </pre>
2367      * Failure to follow this advice may result in non-deterministic behavior.
2368      *
2369      * <p>The returned list will be serializable if the specified list is
2370      * serializable.
2371      *
2372      * @param  <T> the class of the objects in the list
2373      * @param  list the list to be "wrapped" in a synchronized list.
2374      * @return a synchronized view of the specified list.
2375      */
2376     public static <T> List<T> synchronizedList(List<T> list) {
2377         return (list instanceof RandomAccess ?
2378                 new SynchronizedRandomAccessList<>(list) :
2379                 new SynchronizedList<>(list));
2380     }
2381 
2382     static <T> List<T> synchronizedList(List<T> list, Object mutex) {
2383         return (list instanceof RandomAccess ?
2384                 new SynchronizedRandomAccessList<>(list, mutex) :
2385                 new SynchronizedList<>(list, mutex));
2386     }
2387 
2388     /**
2389      * @serial include
2390      */
2391     static class SynchronizedList<E>
2392         extends SynchronizedCollection<E>
2393         implements List<E> {
2394         private static final long serialVersionUID = -7754090372962971524L;
2395 
2396         final List<E> list;
2397 
2398         SynchronizedList(List<E> list) {
2399             super(list);
2400             this.list = list;
2401         }
2402         SynchronizedList(List<E> list, Object mutex) {
2403             super(list, mutex);
2404             this.list = list;
2405         }
2406 
2407         public boolean equals(Object o) {
2408             if (this == o)
2409                 return true;
2410             synchronized (mutex) {return list.equals(o);}
2411         }
2412         public int hashCode() {
2413             synchronized (mutex) {return list.hashCode();}
2414         }
2415 
2416         public E get(int index) {
2417             synchronized (mutex) {return list.get(index);}
2418         }
2419         public E set(int index, E element) {
2420             synchronized (mutex) {return list.set(index, element);}
2421         }
2422         public void add(int index, E element) {
2423             synchronized (mutex) {list.add(index, element);}
2424         }
2425         public E remove(int index) {
2426             synchronized (mutex) {return list.remove(index);}
2427         }
2428 
2429         public int indexOf(Object o) {
2430             synchronized (mutex) {return list.indexOf(o);}
2431         }
2432         public int lastIndexOf(Object o) {
2433             synchronized (mutex) {return list.lastIndexOf(o);}
2434         }
2435 
2436         public boolean addAll(int index, Collection<? extends E> c) {
2437             synchronized (mutex) {return list.addAll(index, c);}
2438         }
2439 
2440         public ListIterator<E> listIterator() {
2441             return list.listIterator(); // Must be manually synched by user
2442         }
2443 
2444         public ListIterator<E> listIterator(int index) {
2445             return list.listIterator(index); // Must be manually synched by user
2446         }
2447 
2448         public List<E> subList(int fromIndex, int toIndex) {
2449             synchronized (mutex) {
2450                 return new SynchronizedList<>(list.subList(fromIndex, toIndex),
2451                                             mutex);
2452             }
2453         }
2454 
2455         @Override
2456         public void replaceAll(UnaryOperator<E> operator) {
2457             synchronized (mutex) {list.replaceAll(operator);}
2458         }
2459         @Override
2460         public void sort(Comparator<? super E> c) {
2461             synchronized (mutex) {list.sort(c);}
2462         }
2463 
2464         /**
2465          * SynchronizedRandomAccessList instances are serialized as
2466          * SynchronizedList instances to allow them to be deserialized
2467          * in pre-1.4 JREs (which do not have SynchronizedRandomAccessList).
2468          * This method inverts the transformation.  As a beneficial
2469          * side-effect, it also grafts the RandomAccess marker onto
2470          * SynchronizedList instances that were serialized in pre-1.4 JREs.
2471          *
2472          * Note: Unfortunately, SynchronizedRandomAccessList instances
2473          * serialized in 1.4.1 and deserialized in 1.4 will become
2474          * SynchronizedList instances, as this method was missing in 1.4.
2475          */
2476         private Object readResolve() {
2477             return (list instanceof RandomAccess
2478                     ? new SynchronizedRandomAccessList<>(list)
2479                     : this);
2480         }
2481     }
2482 
2483     /**
2484      * @serial include
2485      */
2486     static class SynchronizedRandomAccessList<E>
2487         extends SynchronizedList<E>
2488         implements RandomAccess {
2489 
2490         SynchronizedRandomAccessList(List<E> list) {
2491             super(list);
2492         }
2493 
2494         SynchronizedRandomAccessList(List<E> list, Object mutex) {
2495             super(list, mutex);
2496         }
2497 
2498         public List<E> subList(int fromIndex, int toIndex) {
2499             synchronized (mutex) {
2500                 return new SynchronizedRandomAccessList<>(
2501                     list.subList(fromIndex, toIndex), mutex);
2502             }
2503         }
2504 
2505         private static final long serialVersionUID = 1530674583602358482L;
2506 
2507         /**
2508          * Allows instances to be deserialized in pre-1.4 JREs (which do
2509          * not have SynchronizedRandomAccessList).  SynchronizedList has
2510          * a readResolve method that inverts this transformation upon
2511          * deserialization.
2512          */
2513         private Object writeReplace() {
2514             return new SynchronizedList<>(list);
2515         }
2516     }
2517 
2518     /**
2519      * Returns a synchronized (thread-safe) map backed by the specified
2520      * map.  In order to guarantee serial access, it is critical that
2521      * <strong>all</strong> access to the backing map is accomplished
2522      * through the returned map.<p>
2523      *
2524      * It is imperative that the user manually synchronize on the returned
2525      * map when iterating over any of its collection views:
2526      * <pre>
2527      *  Map m = Collections.synchronizedMap(new HashMap());
2528      *      ...
2529      *  Set s = m.keySet();  // Needn't be in synchronized block
2530      *      ...
2531      *  synchronized (m) {  // Synchronizing on m, not s!
2532      *      Iterator i = s.iterator(); // Must be in synchronized block
2533      *      while (i.hasNext())
2534      *          foo(i.next());
2535      *  }
2536      * </pre>
2537      * Failure to follow this advice may result in non-deterministic behavior.
2538      *
2539      * <p>The returned map will be serializable if the specified map is
2540      * serializable.
2541      *
2542      * @param <K> the class of the map keys
2543      * @param <V> the class of the map values
2544      * @param  m the map to be "wrapped" in a synchronized map.
2545      * @return a synchronized view of the specified map.
2546      */
2547     public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
2548         return new SynchronizedMap<>(m);
2549     }
2550 
2551     /**
2552      * @serial include
2553      */
2554     private static class SynchronizedMap<K,V>
2555         implements Map<K,V>, Serializable {
2556         private static final long serialVersionUID = 1978198479659022715L;
2557 
2558         private final Map<K,V> m;     // Backing Map
2559         final Object      mutex;        // Object on which to synchronize
2560 
2561         SynchronizedMap(Map<K,V> m) {
2562             this.m = Objects.requireNonNull(m);
2563             mutex = this;
2564         }
2565 
2566         SynchronizedMap(Map<K,V> m, Object mutex) {
2567             this.m = m;
2568             this.mutex = mutex;
2569         }
2570 
2571         public int size() {
2572             synchronized (mutex) {return m.size();}
2573         }
2574         public boolean isEmpty() {
2575             synchronized (mutex) {return m.isEmpty();}
2576         }
2577         public boolean containsKey(Object key) {
2578             synchronized (mutex) {return m.containsKey(key);}
2579         }
2580         public boolean containsValue(Object value) {
2581             synchronized (mutex) {return m.containsValue(value);}
2582         }
2583         public V get(Object key) {
2584             synchronized (mutex) {return m.get(key);}
2585         }
2586 
2587         public V put(K key, V value) {
2588             synchronized (mutex) {return m.put(key, value);}
2589         }
2590         public V remove(Object key) {
2591             synchronized (mutex) {return m.remove(key);}
2592         }
2593         public void putAll(Map<? extends K, ? extends V> map) {
2594             synchronized (mutex) {m.putAll(map);}
2595         }
2596         public void clear() {
2597             synchronized (mutex) {m.clear();}
2598         }
2599 
2600         private transient Set<K> keySet;
2601         private transient Set<Map.Entry<K,V>> entrySet;
2602         private transient Collection<V> values;
2603 
2604         public Set<K> keySet() {
2605             synchronized (mutex) {
2606                 if (keySet==null)
2607                     keySet = new SynchronizedSet<>(m.keySet(), mutex);
2608                 return keySet;
2609             }
2610         }
2611 
2612         public Set<Map.Entry<K,V>> entrySet() {
2613             synchronized (mutex) {
2614                 if (entrySet==null)
2615                     entrySet = new SynchronizedSet<>(m.entrySet(), mutex);
2616                 return entrySet;
2617             }
2618         }
2619 
2620         public Collection<V> values() {
2621             synchronized (mutex) {
2622                 if (values==null)
2623                     values = new SynchronizedCollection<>(m.values(), mutex);
2624                 return values;
2625             }
2626         }
2627 
2628         public boolean equals(Object o) {
2629             if (this == o)
2630                 return true;
2631             synchronized (mutex) {return m.equals(o);}
2632         }
2633         public int hashCode() {
2634             synchronized (mutex) {return m.hashCode();}
2635         }
2636         public String toString() {
2637             synchronized (mutex) {return m.toString();}
2638         }
2639 
2640         // Override default methods in Map
2641         @Override
2642         public V getOrDefault(Object k, V defaultValue) {
2643             synchronized (mutex) {return m.getOrDefault(k, defaultValue);}
2644         }
2645         @Override
2646         public void forEach(BiConsumer<? super K, ? super V> action) {
2647             synchronized (mutex) {m.forEach(action);}
2648         }
2649         @Override
2650         public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
2651             synchronized (mutex) {m.replaceAll(function);}
2652         }
2653         @Override
2654         public V putIfAbsent(K key, V value) {
2655             synchronized (mutex) {return m.putIfAbsent(key, value);}
2656         }
2657         @Override
2658         public boolean remove(Object key, Object value) {
2659             synchronized (mutex) {return m.remove(key, value);}
2660         }
2661         @Override
2662         public boolean replace(K key, V oldValue, V newValue) {
2663             synchronized (mutex) {return m.replace(key, oldValue, newValue);}
2664         }
2665         @Override
2666         public V replace(K key, V value) {
2667             synchronized (mutex) {return m.replace(key, value);}
2668         }
2669         @Override
2670         public V computeIfAbsent(K key,
2671                 Function<? super K, ? extends V> mappingFunction) {
2672             synchronized (mutex) {return m.computeIfAbsent(key, mappingFunction);}
2673         }
2674         @Override
2675         public V computeIfPresent(K key,
2676                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
2677             synchronized (mutex) {return m.computeIfPresent(key, remappingFunction);}
2678         }
2679         @Override
2680         public V compute(K key,
2681                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
2682             synchronized (mutex) {return m.compute(key, remappingFunction);}
2683         }
2684         @Override
2685         public V merge(K key, V value,
2686                 BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
2687             synchronized (mutex) {return m.merge(key, value, remappingFunction);}
2688         }
2689 
2690         private void writeObject(ObjectOutputStream s) throws IOException {
2691             synchronized (mutex) {s.defaultWriteObject();}
2692         }
2693     }
2694 
2695     /**
2696      * Returns a synchronized (thread-safe) sorted map backed by the specified
2697      * sorted map.  In order to guarantee serial access, it is critical that
2698      * <strong>all</strong> access to the backing sorted map is accomplished
2699      * through the returned sorted map (or its views).<p>
2700      *
2701      * It is imperative that the user manually synchronize on the returned
2702      * sorted map when iterating over any of its collection views, or the
2703      * collections views of any of its <tt>subMap</tt>, <tt>headMap</tt> or
2704      * <tt>tailMap</tt> views.
2705      * <pre>
2706      *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2707      *      ...
2708      *  Set s = m.keySet();  // Needn't be in synchronized block
2709      *      ...
2710      *  synchronized (m) {  // Synchronizing on m, not s!
2711      *      Iterator i = s.iterator(); // Must be in synchronized block
2712      *      while (i.hasNext())
2713      *          foo(i.next());
2714      *  }
2715      * </pre>
2716      * or:
2717      * <pre>
2718      *  SortedMap m = Collections.synchronizedSortedMap(new TreeMap());
2719      *  SortedMap m2 = m.subMap(foo, bar);
2720      *      ...
2721      *  Set s2 = m2.keySet();  // Needn't be in synchronized block
2722      *      ...
2723      *  synchronized (m) {  // Synchronizing on m, not m2 or s2!
2724      *      Iterator i = s.iterator(); // Must be in synchronized block
2725      *      while (i.hasNext())
2726      *          foo(i.next());
2727      *  }
2728      * </pre>
2729      * Failure to follow this advice may result in non-deterministic behavior.
2730      *
2731      * <p>The returned sorted map will be serializable if the specified
2732      * sorted map is serializable.
2733      *
2734      * @param <K> the class of the map keys
2735      * @param <V> the class of the map values
2736      * @param  m the sorted map to be "wrapped" in a synchronized sorted map.
2737      * @return a synchronized view of the specified sorted map.
2738      */
2739     public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m) {
2740         return new SynchronizedSortedMap<>(m);
2741     }
2742 
2743     /**
2744      * @serial include
2745      */
2746     static class SynchronizedSortedMap<K,V>
2747         extends SynchronizedMap<K,V>
2748         implements SortedMap<K,V>
2749     {
2750         private static final long serialVersionUID = -8798146769416483793L;
2751 
2752         private final SortedMap<K,V> sm;
2753 
2754         SynchronizedSortedMap(SortedMap<K,V> m) {
2755             super(m);
2756             sm = m;
2757         }
2758         SynchronizedSortedMap(SortedMap<K,V> m, Object mutex) {
2759             super(m, mutex);
2760             sm = m;
2761         }
2762 
2763         public Comparator<? super K> comparator() {
2764             synchronized (mutex) {return sm.comparator();}
2765         }
2766 
2767         public SortedMap<K,V> subMap(K fromKey, K toKey) {
2768             synchronized (mutex) {
2769                 return new SynchronizedSortedMap<>(
2770                     sm.subMap(fromKey, toKey), mutex);
2771             }
2772         }
2773         public SortedMap<K,V> headMap(K toKey) {
2774             synchronized (mutex) {
2775                 return new SynchronizedSortedMap<>(sm.headMap(toKey), mutex);
2776             }
2777         }
2778         public SortedMap<K,V> tailMap(K fromKey) {
2779             synchronized (mutex) {
2780                return new SynchronizedSortedMap<>(sm.tailMap(fromKey),mutex);
2781             }
2782         }
2783 
2784         public K firstKey() {
2785             synchronized (mutex) {return sm.firstKey();}
2786         }
2787         public K lastKey() {
2788             synchronized (mutex) {return sm.lastKey();}
2789         }
2790     }
2791 
2792     /**
2793      * Returns a synchronized (thread-safe) navigable map backed by the
2794      * specified navigable map.  In order to guarantee serial access, it is
2795      * critical that <strong>all</strong> access to the backing navigable map is
2796      * accomplished through the returned navigable map (or its views).<p>
2797      *
2798      * It is imperative that the user manually synchronize on the returned
2799      * navigable map when iterating over any of its collection views, or the
2800      * collections views of any of its {@code subMap}, {@code headMap} or
2801      * {@code tailMap} views.
2802      * <pre>
2803      *  NavigableMap m = Collections.synchronizedNavigableMap(new TreeMap());
2804      *      ...
2805      *  Set s = m.keySet();  // Needn't be in synchronized block
2806      *      ...
2807      *  synchronized (m) {  // Synchronizing on m, not s!
2808      *      Iterator i = s.iterator(); // Must be in synchronized block
2809      *      while (i.hasNext())
2810      *          foo(i.next());
2811      *  }
2812      * </pre>
2813      * or:
2814      * <pre>
2815      *  NavigableMap m = Collections.synchronizedNavigableMap(new TreeMap());
2816      *  NavigableMap m2 = m.subMap(foo, true, bar, false);
2817      *      ...
2818      *  Set s2 = m2.keySet();  // Needn't be in synchronized block
2819      *      ...
2820      *  synchronized (m) {  // Synchronizing on m, not m2 or s2!
2821      *      Iterator i = s.iterator(); // Must be in synchronized block
2822      *      while (i.hasNext())
2823      *          foo(i.next());
2824      *  }
2825      * </pre>
2826      * Failure to follow this advice may result in non-deterministic behavior.
2827      *
2828      * <p>The returned navigable map will be serializable if the specified
2829      * navigable map is serializable.
2830      *
2831      * @param <K> the class of the map keys
2832      * @param <V> the class of the map values
2833      * @param  m the navigable map to be "wrapped" in a synchronized navigable
2834      *              map
2835      * @return a synchronized view of the specified navigable map.
2836      * @since 1.8
2837      */
2838     public static <K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m) {
2839         return new SynchronizedNavigableMap<>(m);
2840     }
2841 
2842     /**
2843      * A synchronized NavigableMap.
2844      *
2845      * @serial include
2846      */
2847     static class SynchronizedNavigableMap<K,V>
2848         extends SynchronizedSortedMap<K,V>
2849         implements NavigableMap<K,V>
2850     {
2851         private static final long serialVersionUID = 699392247599746807L;
2852 
2853         private final NavigableMap<K,V> nm;
2854 
2855         SynchronizedNavigableMap(NavigableMap<K,V> m) {
2856             super(m);
2857             nm = m;
2858         }
2859         SynchronizedNavigableMap(NavigableMap<K,V> m, Object mutex) {
2860             super(m, mutex);
2861             nm = m;
2862         }
2863 
2864         public Entry<K, V> lowerEntry(K key)
2865                         { synchronized (mutex) { return nm.lowerEntry(key); } }
2866         public K lowerKey(K key)
2867                           { synchronized (mutex) { return nm.lowerKey(key); } }
2868         public Entry<K, V> floorEntry(K key)
2869                         { synchronized (mutex) { return nm.floorEntry(key); } }
2870         public K floorKey(K key)
2871                           { synchronized (mutex) { return nm.floorKey(key); } }
2872         public Entry<K, V> ceilingEntry(K key)
2873                       { synchronized (mutex) { return nm.ceilingEntry(key); } }
2874         public K ceilingKey(K key)
2875                         { synchronized (mutex) { return nm.ceilingKey(key); } }
2876         public Entry<K, V> higherEntry(K key)
2877                        { synchronized (mutex) { return nm.higherEntry(key); } }
2878         public K higherKey(K key)
2879                          { synchronized (mutex) { return nm.higherKey(key); } }
2880         public Entry<K, V> firstEntry()
2881                            { synchronized (mutex) { return nm.firstEntry(); } }
2882         public Entry<K, V> lastEntry()
2883                             { synchronized (mutex) { return nm.lastEntry(); } }
2884         public Entry<K, V> pollFirstEntry()
2885                        { synchronized (mutex) { return nm.pollFirstEntry(); } }
2886         public Entry<K, V> pollLastEntry()
2887                         { synchronized (mutex) { return nm.pollLastEntry(); } }
2888 
2889         public NavigableMap<K, V> descendingMap() {
2890             synchronized (mutex) {
2891                 return
2892                     new SynchronizedNavigableMap<>(nm.descendingMap(), mutex);
2893             }
2894         }
2895 
2896         public NavigableSet<K> keySet() {
2897             return navigableKeySet();
2898         }
2899 
2900         public NavigableSet<K> navigableKeySet() {
2901             synchronized (mutex) {
2902                 return new SynchronizedNavigableSet<>(nm.navigableKeySet(), mutex);
2903             }
2904         }
2905 
2906         public NavigableSet<K> descendingKeySet() {
2907             synchronized (mutex) {
2908                 return new SynchronizedNavigableSet<>(nm.descendingKeySet(), mutex);
2909             }
2910         }
2911 
2912 
2913         public SortedMap<K,V> subMap(K fromKey, K toKey) {
2914             synchronized (mutex) {
2915                 return new SynchronizedNavigableMap<>(
2916                     nm.subMap(fromKey, true, toKey, false), mutex);
2917             }
2918         }
2919         public SortedMap<K,V> headMap(K toKey) {
2920             synchronized (mutex) {
2921                 return new SynchronizedNavigableMap<>(nm.headMap(toKey, false), mutex);
2922             }
2923         }
2924         public SortedMap<K,V> tailMap(K fromKey) {
2925             synchronized (mutex) {
2926         return new SynchronizedNavigableMap<>(nm.tailMap(fromKey, true),mutex);
2927             }
2928         }
2929 
2930         public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
2931             synchronized (mutex) {
2932                 return new SynchronizedNavigableMap<>(
2933                     nm.subMap(fromKey, fromInclusive, toKey, toInclusive), mutex);
2934             }
2935         }
2936 
2937         public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
2938             synchronized (mutex) {
2939                 return new SynchronizedNavigableMap<>(
2940                         nm.headMap(toKey, inclusive), mutex);
2941             }
2942         }
2943 
2944         public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
2945             synchronized (mutex) {
2946                 return new SynchronizedNavigableMap<>(
2947                     nm.tailMap(fromKey, inclusive), mutex);
2948             }
2949         }
2950     }
2951 
2952     // Dynamically typesafe collection wrappers
2953 
2954     /**
2955      * Returns a dynamically typesafe view of the specified collection.
2956      * Any attempt to insert an element of the wrong type will result in an
2957      * immediate {@link ClassCastException}.  Assuming a collection
2958      * contains no incorrectly typed elements prior to the time a
2959      * dynamically typesafe view is generated, and that all subsequent
2960      * access to the collection takes place through the view, it is
2961      * <i>guaranteed</i> that the collection cannot contain an incorrectly
2962      * typed element.
2963      *
2964      * <p>The generics mechanism in the language provides compile-time
2965      * (static) type checking, but it is possible to defeat this mechanism
2966      * with unchecked casts.  Usually this is not a problem, as the compiler
2967      * issues warnings on all such unchecked operations.  There are, however,
2968      * times when static type checking alone is not sufficient.  For example,
2969      * suppose a collection is passed to a third-party library and it is
2970      * imperative that the library code not corrupt the collection by
2971      * inserting an element of the wrong type.
2972      *
2973      * <p>Another use of dynamically typesafe views is debugging.  Suppose a
2974      * program fails with a {@code ClassCastException}, indicating that an
2975      * incorrectly typed element was put into a parameterized collection.
2976      * Unfortunately, the exception can occur at any time after the erroneous
2977      * element is inserted, so it typically provides little or no information
2978      * as to the real source of the problem.  If the problem is reproducible,
2979      * one can quickly determine its source by temporarily modifying the
2980      * program to wrap the collection with a dynamically typesafe view.
2981      * For example, this declaration:
2982      *  <pre> {@code
2983      *     Collection<String> c = new HashSet<>();
2984      * }</pre>
2985      * may be replaced temporarily by this one:
2986      *  <pre> {@code
2987      *     Collection<String> c = Collections.checkedCollection(
2988      *         new HashSet<>(), String.class);
2989      * }</pre>
2990      * Running the program again will cause it to fail at the point where
2991      * an incorrectly typed element is inserted into the collection, clearly
2992      * identifying the source of the problem.  Once the problem is fixed, the
2993      * modified declaration may be reverted back to the original.
2994      *
2995      * <p>The returned collection does <i>not</i> pass the hashCode and equals
2996      * operations through to the backing collection, but relies on
2997      * {@code Object}'s {@code equals} and {@code hashCode} methods.  This
2998      * is necessary to preserve the contracts of these operations in the case
2999      * that the backing collection is a set or a list.
3000      *
3001      * <p>The returned collection will be serializable if the specified
3002      * collection is serializable.
3003      *
3004      * <p>Since {@code null} is considered to be a value of any reference
3005      * type, the returned collection permits insertion of null elements
3006      * whenever the backing collection does.
3007      *
3008      * @param <E> the class of the objects in the collection
3009      * @param c the collection for which a dynamically typesafe view is to be
3010      *          returned
3011      * @param type the type of element that {@code c} is permitted to hold
3012      * @return a dynamically typesafe view of the specified collection
3013      * @since 1.5
3014      */
3015     public static <E> Collection<E> checkedCollection(Collection<E> c,
3016                                                       Class<E> type) {
3017         return new CheckedCollection<>(c, type);
3018     }
3019 
3020     @SuppressWarnings("unchecked")
3021     static <T> T[] zeroLengthArray(Class<T> type) {
3022         return (T[]) Array.newInstance(type, 0);
3023     }
3024 
3025     /**
3026      * @serial include
3027      */
3028     static class CheckedCollection<E> implements Collection<E>, Serializable {
3029         private static final long serialVersionUID = 1578914078182001775L;
3030 
3031         final Collection<E> c;
3032         final Class<E> type;
3033 
3034         E typeCheck(Object o) {
3035             if (o != null && !type.isInstance(o))
3036                 throw new ClassCastException(badElementMsg(o));
3037             return (E) o;
3038         }
3039 
3040         private String badElementMsg(Object o) {
3041             return "Attempt to insert " + o.getClass() +
3042                 " element into collection with element type " + type;
3043         }
3044 
3045         CheckedCollection(Collection<E> c, Class<E> type) {
3046             this.c = Objects.requireNonNull(c, "c");
3047             this.type = Objects.requireNonNull(type, "type");
3048         }
3049 
3050         public int size()                 { return c.size(); }
3051         public boolean isEmpty()          { return c.isEmpty(); }
3052         public boolean contains(Object o) { return c.contains(o); }
3053         public Object[] toArray()         { return c.toArray(); }
3054         public <T> T[] toArray(T[] a)     { return c.toArray(a); }
3055         public String toString()          { return c.toString(); }
3056         public boolean remove(Object o)   { return c.remove(o); }
3057         public void clear()               {        c.clear(); }
3058 
3059         public boolean containsAll(Collection<?> coll) {
3060             return c.containsAll(coll);
3061         }
3062         public boolean removeAll(Collection<?> coll) {
3063             return c.removeAll(coll);
3064         }
3065         public boolean retainAll(Collection<?> coll) {
3066             return c.retainAll(coll);
3067         }
3068 
3069         public Iterator<E> iterator() {
3070             // JDK-6363904 - unwrapped iterator could be typecast to
3071             // ListIterator with unsafe set()
3072             final Iterator<E> it = c.iterator();
3073             return new Iterator<E>() {
3074                 public boolean hasNext() { return it.hasNext(); }
3075                 public E next()          { return it.next(); }
3076                 public void remove()     {        it.remove(); }};
3077         }
3078 
3079         public boolean add(E e) {
3080             typeCheck(e);
3081             return c.add(e);
3082         }
3083 
3084         private E[] zeroLengthElementArray; // Lazily initialized
3085 
3086         private E[] zeroLengthElementArray() {
3087             return zeroLengthElementArray != null ? zeroLengthElementArray :
3088                 (zeroLengthElementArray = zeroLengthArray(type));
3089         }
3090 
3091         @SuppressWarnings("unchecked")
3092         Collection<E> checkedCopyOf(Collection<? extends E> coll) {
3093             Object[] a;
3094             try {
3095                 E[] z = zeroLengthElementArray();
3096                 a = coll.toArray(z);
3097                 // Defend against coll violating the toArray contract
3098                 if (a.getClass() != z.getClass())
3099                     a = Arrays.copyOf(a, a.length, z.getClass());
3100             } catch (ArrayStoreException ignore) {
3101                 // To get better and consistent diagnostics,
3102                 // we call typeCheck explicitly on each element.
3103                 // We call clone() to defend against coll retaining a
3104                 // reference to the returned array and storing a bad
3105                 // element into it after it has been type checked.
3106                 a = coll.toArray().clone();
3107                 for (Object o : a)
3108                     typeCheck(o);
3109             }
3110             // A slight abuse of the type system, but safe here.
3111             return (Collection<E>) Arrays.asList(a);
3112         }
3113 
3114         public boolean addAll(Collection<? extends E> coll) {
3115             // Doing things this way insulates us from concurrent changes
3116             // in the contents of coll and provides all-or-nothing
3117             // semantics (which we wouldn't get if we type-checked each
3118             // element as we added it)
3119             return c.addAll(checkedCopyOf(coll));
3120         }
3121 
3122         // Override default methods in Collection
3123         @Override
3124         public void forEach(Consumer<? super E> action) {c.forEach(action);}
3125         @Override
3126         public boolean removeIf(Predicate<? super E> filter) {
3127             return c.removeIf(filter);
3128         }
3129         @Override
3130         public Spliterator<E> spliterator() {return c.spliterator();}
3131         @Override
3132         public Stream<E> stream()           {return c.stream();}
3133         @Override
3134         public Stream<E> parallelStream()   {return c.parallelStream();}
3135     }
3136 
3137     /**
3138      * Returns a dynamically typesafe view of the specified queue.
3139      * Any attempt to insert an element of the wrong type will result in
3140      * an immediate {@link ClassCastException}.  Assuming a queue contains
3141      * no incorrectly typed elements prior to the time a dynamically typesafe
3142      * view is generated, and that all subsequent access to the queue
3143      * takes place through the view, it is <i>guaranteed</i> that the
3144      * queue cannot contain an incorrectly typed element.
3145      *
3146      * <p>A discussion of the use of dynamically typesafe views may be
3147      * found in the documentation for the {@link #checkedCollection
3148      * checkedCollection} method.
3149      *
3150      * <p>The returned queue will be serializable if the specified queue
3151      * is serializable.
3152      *
3153      * <p>Since {@code null} is considered to be a value of any reference
3154      * type, the returned queue permits insertion of {@code null} elements
3155      * whenever the backing queue does.
3156      *
3157      * @param <E> the class of the objects in the queue
3158      * @param queue the queue for which a dynamically typesafe view is to be
3159      *             returned
3160      * @param type the type of element that {@code queue} is permitted to hold
3161      * @return a dynamically typesafe view of the specified queue
3162      * @since 1.8
3163      */
3164     public static <E> Queue<E> checkedQueue(Queue<E> queue, Class<E> type) {
3165         return new CheckedQueue<>(queue, type);
3166     }
3167 
3168     /**
3169      * @serial include
3170      */
3171     static class CheckedQueue<E>
3172         extends CheckedCollection<E>
3173         implements Queue<E>, Serializable
3174     {
3175         private static final long serialVersionUID = 1433151992604707767L;
3176         final Queue<E> queue;
3177 
3178         CheckedQueue(Queue<E> queue, Class<E> elementType) {
3179             super(queue, elementType);
3180             this.queue = queue;
3181         }
3182 
3183         public E element()              {return queue.element();}
3184         public boolean equals(Object o) {return o == this || c.equals(o);}
3185         public int hashCode()           {return c.hashCode();}
3186         public E peek()                 {return queue.peek();}
3187         public E poll()                 {return queue.poll();}
3188         public E remove()               {return queue.remove();}
3189 
3190         public boolean offer(E e) {
3191             typeCheck(e);
3192             return add(e);
3193         }
3194     }
3195 
3196     /**
3197      * Returns a dynamically typesafe view of the specified set.
3198      * Any attempt to insert an element of the wrong type will result in
3199      * an immediate {@link ClassCastException}.  Assuming a set contains
3200      * no incorrectly typed elements prior to the time a dynamically typesafe
3201      * view is generated, and that all subsequent access to the set
3202      * takes place through the view, it is <i>guaranteed</i> that the
3203      * set cannot contain an incorrectly typed element.
3204      *
3205      * <p>A discussion of the use of dynamically typesafe views may be
3206      * found in the documentation for the {@link #checkedCollection
3207      * checkedCollection} method.
3208      *
3209      * <p>The returned set will be serializable if the specified set is
3210      * serializable.
3211      *
3212      * <p>Since {@code null} is considered to be a value of any reference
3213      * type, the returned set permits insertion of null elements whenever
3214      * the backing set does.
3215      *
3216      * @param <E> the class of the objects in the set
3217      * @param s the set for which a dynamically typesafe view is to be
3218      *          returned
3219      * @param type the type of element that {@code s} is permitted to hold
3220      * @return a dynamically typesafe view of the specified set
3221      * @since 1.5
3222      */
3223     public static <E> Set<E> checkedSet(Set<E> s, Class<E> type) {
3224         return new CheckedSet<>(s, type);
3225     }
3226 
3227     /**
3228      * @serial include
3229      */
3230     static class CheckedSet<E> extends CheckedCollection<E>
3231                                  implements Set<E>, Serializable
3232     {
3233         private static final long serialVersionUID = 4694047833775013803L;
3234 
3235         CheckedSet(Set<E> s, Class<E> elementType) { super(s, elementType); }
3236 
3237         public boolean equals(Object o) { return o == this || c.equals(o); }
3238         public int hashCode()           { return c.hashCode(); }
3239     }
3240 
3241     /**
3242      * Returns a dynamically typesafe view of the specified sorted set.
3243      * Any attempt to insert an element of the wrong type will result in an
3244      * immediate {@link ClassCastException}.  Assuming a sorted set
3245      * contains no incorrectly typed elements prior to the time a
3246      * dynamically typesafe view is generated, and that all subsequent
3247      * access to the sorted set takes place through the view, it is
3248      * <i>guaranteed</i> that the sorted set cannot contain an incorrectly
3249      * typed element.
3250      *
3251      * <p>A discussion of the use of dynamically typesafe views may be
3252      * found in the documentation for the {@link #checkedCollection
3253      * checkedCollection} method.
3254      *
3255      * <p>The returned sorted set will be serializable if the specified sorted
3256      * set is serializable.
3257      *
3258      * <p>Since {@code null} is considered to be a value of any reference
3259      * type, the returned sorted set permits insertion of null elements
3260      * whenever the backing sorted set does.
3261      *
3262      * @param <E> the class of the objects in the set
3263      * @param s the sorted set for which a dynamically typesafe view is to be
3264      *          returned
3265      * @param type the type of element that {@code s} is permitted to hold
3266      * @return a dynamically typesafe view of the specified sorted set
3267      * @since 1.5
3268      */
3269     public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,
3270                                                     Class<E> type) {
3271         return new CheckedSortedSet<>(s, type);
3272     }
3273 
3274     /**
3275      * @serial include
3276      */
3277     static class CheckedSortedSet<E> extends CheckedSet<E>
3278         implements SortedSet<E>, Serializable
3279     {
3280         private static final long serialVersionUID = 1599911165492914959L;
3281 
3282         private final SortedSet<E> ss;
3283 
3284         CheckedSortedSet(SortedSet<E> s, Class<E> type) {
3285             super(s, type);
3286             ss = s;
3287         }
3288 
3289         public Comparator<? super E> comparator() { return ss.comparator(); }
3290         public E first()                   { return ss.first(); }
3291         public E last()                    { return ss.last(); }
3292 
3293         public SortedSet<E> subSet(E fromElement, E toElement) {
3294             return checkedSortedSet(ss.subSet(fromElement,toElement), type);
3295         }
3296         public SortedSet<E> headSet(E toElement) {
3297             return checkedSortedSet(ss.headSet(toElement), type);
3298         }
3299         public SortedSet<E> tailSet(E fromElement) {
3300             return checkedSortedSet(ss.tailSet(fromElement), type);
3301         }
3302     }
3303 
3304 /**
3305      * Returns a dynamically typesafe view of the specified navigable set.
3306      * Any attempt to insert an element of the wrong type will result in an
3307      * immediate {@link ClassCastException}.  Assuming a navigable set
3308      * contains no incorrectly typed elements prior to the time a
3309      * dynamically typesafe view is generated, and that all subsequent
3310      * access to the navigable set takes place through the view, it is
3311      * <em>guaranteed</em> that the navigable set cannot contain an incorrectly
3312      * typed element.
3313      *
3314      * <p>A discussion of the use of dynamically typesafe views may be
3315      * found in the documentation for the {@link #checkedCollection
3316      * checkedCollection} method.
3317      *
3318      * <p>The returned navigable set will be serializable if the specified
3319      * navigable set is serializable.
3320      *
3321      * <p>Since {@code null} is considered to be a value of any reference
3322      * type, the returned navigable set permits insertion of null elements
3323      * whenever the backing sorted set does.
3324      *
3325      * @param <E> the class of the objects in the set
3326      * @param s the navigable set for which a dynamically typesafe view is to be
3327      *          returned
3328      * @param type the type of element that {@code s} is permitted to hold
3329      * @return a dynamically typesafe view of the specified navigable set
3330      * @since 1.8
3331      */
3332     public static <E> NavigableSet<E> checkedNavigableSet(NavigableSet<E> s,
3333                                                     Class<E> type) {
3334         return new CheckedNavigableSet<>(s, type);
3335     }
3336 
3337     /**
3338      * @serial include
3339      */
3340     static class CheckedNavigableSet<E> extends CheckedSortedSet<E>
3341         implements NavigableSet<E>, Serializable
3342     {
3343         private static final long serialVersionUID = -5429120189805438922L;
3344 
3345         private final NavigableSet<E> ns;
3346 
3347         CheckedNavigableSet(NavigableSet<E> s, Class<E> type) {
3348             super(s, type);
3349             ns = s;
3350         }
3351 
3352         public E lower(E e)                             { return ns.lower(e); }
3353         public E floor(E e)                             { return ns.floor(e); }
3354         public E ceiling(E e)                         { return ns.ceiling(e); }
3355         public E higher(E e)                           { return ns.higher(e); }
3356         public E pollFirst()                         { return ns.pollFirst(); }
3357         public E pollLast()                            {return ns.pollLast(); }
3358         public NavigableSet<E> descendingSet()
3359                       { return checkedNavigableSet(ns.descendingSet(), type); }
3360         public Iterator<E> descendingIterator()
3361             {return checkedNavigableSet(ns.descendingSet(), type).iterator(); }
3362 
3363         public NavigableSet<E> subSet(E fromElement, E toElement) {
3364             return checkedNavigableSet(ns.subSet(fromElement, true, toElement, false), type);
3365         }
3366         public NavigableSet<E> headSet(E toElement) {
3367             return checkedNavigableSet(ns.headSet(toElement, false), type);
3368         }
3369         public NavigableSet<E> tailSet(E fromElement) {
3370             return checkedNavigableSet(ns.tailSet(fromElement, true), type);
3371         }
3372 
3373         public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) {
3374             return checkedNavigableSet(ns.subSet(fromElement, fromInclusive, toElement, toInclusive), type);
3375         }
3376 
3377         public NavigableSet<E> headSet(E toElement, boolean inclusive) {
3378             return checkedNavigableSet(ns.headSet(toElement, inclusive), type);
3379         }
3380 
3381         public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
3382             return checkedNavigableSet(ns.tailSet(fromElement, inclusive), type);
3383         }
3384     }
3385 
3386     /**
3387      * Returns a dynamically typesafe view of the specified list.
3388      * Any attempt to insert an element of the wrong type will result in
3389      * an immediate {@link ClassCastException}.  Assuming a list contains
3390      * no incorrectly typed elements prior to the time a dynamically typesafe
3391      * view is generated, and that all subsequent access to the list
3392      * takes place through the view, it is <i>guaranteed</i> that the
3393      * list cannot contain an incorrectly typed element.
3394      *
3395      * <p>A discussion of the use of dynamically typesafe views may be
3396      * found in the documentation for the {@link #checkedCollection
3397      * checkedCollection} method.
3398      *
3399      * <p>The returned list will be serializable if the specified list
3400      * is serializable.
3401      *
3402      * <p>Since {@code null} is considered to be a value of any reference
3403      * type, the returned list permits insertion of null elements whenever
3404      * the backing list does.
3405      *
3406      * @param <E> the class of the objects in the list
3407      * @param list the list for which a dynamically typesafe view is to be
3408      *             returned
3409      * @param type the type of element that {@code list} is permitted to hold
3410      * @return a dynamically typesafe view of the specified list
3411      * @since 1.5
3412      */
3413     public static <E> List<E> checkedList(List<E> list, Class<E> type) {
3414         return (list instanceof RandomAccess ?
3415                 new CheckedRandomAccessList<>(list, type) :
3416                 new CheckedList<>(list, type));
3417     }
3418 
3419     /**
3420      * @serial include
3421      */
3422     static class CheckedList<E>
3423         extends CheckedCollection<E>
3424         implements List<E>
3425     {
3426         private static final long serialVersionUID = 65247728283967356L;
3427         final List<E> list;
3428 
3429         CheckedList(List<E> list, Class<E> type) {
3430             super(list, type);
3431             this.list = list;
3432         }
3433 
3434         public boolean equals(Object o)  { return o == this || list.equals(o); }
3435         public int hashCode()            { return list.hashCode(); }
3436         public E get(int index)          { return list.get(index); }
3437         public E remove(int index)       { return list.remove(index); }
3438         public int indexOf(Object o)     { return list.indexOf(o); }
3439         public int lastIndexOf(Object o) { return list.lastIndexOf(o); }
3440 
3441         public E set(int index, E element) {
3442             typeCheck(element);
3443             return list.set(index, element);
3444         }
3445 
3446         public void add(int index, E element) {
3447             typeCheck(element);
3448             list.add(index, element);
3449         }
3450 
3451         public boolean addAll(int index, Collection<? extends E> c) {
3452             return list.addAll(index, checkedCopyOf(c));
3453         }
3454         public ListIterator<E> listIterator()   { return listIterator(0); }
3455 
3456         public ListIterator<E> listIterator(final int index) {
3457             final ListIterator<E> i = list.listIterator(index);
3458 
3459             return new ListIterator<E>() {
3460                 public boolean hasNext()     { return i.hasNext(); }
3461                 public E next()              { return i.next(); }
3462                 public boolean hasPrevious() { return i.hasPrevious(); }
3463                 public E previous()          { return i.previous(); }
3464                 public int nextIndex()       { return i.nextIndex(); }
3465                 public int previousIndex()   { return i.previousIndex(); }
3466                 public void remove()         {        i.remove(); }
3467 
3468                 public void set(E e) {
3469                     typeCheck(e);
3470                     i.set(e);
3471                 }
3472 
3473                 public void add(E e) {
3474                     typeCheck(e);
3475                     i.add(e);
3476                 }
3477 
3478                 @Override
3479                 public void forEachRemaining(Consumer<? super E> action) {
3480                     i.forEachRemaining(action);
3481                 }
3482             };
3483         }
3484 
3485         public List<E> subList(int fromIndex, int toIndex) {
3486             return new CheckedList<>(list.subList(fromIndex, toIndex), type);
3487         }
3488 
3489         /**
3490          * {@inheritDoc}
3491          *
3492          * @throws ClassCastException if the class of an element returned by the
3493          *         operator prevents it from being added to this collection
3494          */
3495         @Override
3496         public void replaceAll(UnaryOperator<E> operator) {
3497             list.replaceAll(e -> typeCheck(operator.apply(e)));
3498         }
3499 
3500         @Override
3501         public void sort(Comparator<? super E> c) {
3502             list.sort(c);
3503         }
3504     }
3505 
3506     /**
3507      * @serial include
3508      */
3509     static class CheckedRandomAccessList<E> extends CheckedList<E>
3510                                             implements RandomAccess
3511     {
3512         private static final long serialVersionUID = 1638200125423088369L;
3513 
3514         CheckedRandomAccessList(List<E> list, Class<E> type) {
3515             super(list, type);
3516         }
3517 
3518         public List<E> subList(int fromIndex, int toIndex) {
3519             return new CheckedRandomAccessList<>(
3520                     list.subList(fromIndex, toIndex), type);
3521         }
3522     }
3523 
3524     /**
3525      * Returns a dynamically typesafe view of the specified map.
3526      * Any attempt to insert a mapping whose key or value have the wrong
3527      * type will result in an immediate {@link ClassCastException}.
3528      * Similarly, any attempt to modify the value currently associated with
3529      * a key will result in an immediate {@link ClassCastException},
3530      * whether the modification is attempted directly through the map
3531      * itself, or through a {@link Map.Entry} instance obtained from the
3532      * map's {@link Map#entrySet() entry set} view.
3533      *
3534      * <p>Assuming a map contains no incorrectly typed keys or values
3535      * prior to the time a dynamically typesafe view is generated, and
3536      * that all subsequent access to the map takes place through the view
3537      * (or one of its collection views), it is <i>guaranteed</i> that the
3538      * map cannot contain an incorrectly typed key or value.
3539      *
3540      * <p>A discussion of the use of dynamically typesafe views may be
3541      * found in the documentation for the {@link #checkedCollection
3542      * checkedCollection} method.
3543      *
3544      * <p>The returned map will be serializable if the specified map is
3545      * serializable.
3546      *
3547      * <p>Since {@code null} is considered to be a value of any reference
3548      * type, the returned map permits insertion of null keys or values
3549      * whenever the backing map does.
3550      *
3551      * @param <K> the class of the map keys
3552      * @param <V> the class of the map values
3553      * @param m the map for which a dynamically typesafe view is to be
3554      *          returned
3555      * @param keyType the type of key that {@code m} is permitted to hold
3556      * @param valueType the type of value that {@code m} is permitted to hold
3557      * @return a dynamically typesafe view of the specified map
3558      * @since 1.5
3559      */
3560     public static <K, V> Map<K, V> checkedMap(Map<K, V> m,
3561                                               Class<K> keyType,
3562                                               Class<V> valueType) {
3563         return new CheckedMap<>(m, keyType, valueType);
3564     }
3565 
3566 
3567     /**
3568      * @serial include
3569      */
3570     private static class CheckedMap<K,V>
3571         implements Map<K,V>, Serializable
3572     {
3573         private static final long serialVersionUID = 5742860141034234728L;
3574 
3575         private final Map<K, V> m;
3576         final Class<K> keyType;
3577         final Class<V> valueType;
3578 
3579         private void typeCheck(Object key, Object value) {
3580             if (key != null && !keyType.isInstance(key))
3581                 throw new ClassCastException(badKeyMsg(key));
3582 
3583             if (value != null && !valueType.isInstance(value))
3584                 throw new ClassCastException(badValueMsg(value));
3585         }
3586 
3587         private BiFunction<? super K, ? super V, ? extends V> typeCheck(
3588                 BiFunction<? super K, ? super V, ? extends V> func) {
3589             Objects.requireNonNull(func);
3590             return (k, v) -> {
3591                 V newValue = func.apply(k, v);
3592                 typeCheck(k, newValue);
3593                 return newValue;
3594             };
3595         }
3596 
3597         private String badKeyMsg(Object key) {
3598             return "Attempt to insert " + key.getClass() +
3599                     " key into map with key type " + keyType;
3600         }
3601 
3602         private String badValueMsg(Object value) {
3603             return "Attempt to insert " + value.getClass() +
3604                     " value into map with value type " + valueType;
3605         }
3606 
3607         CheckedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType) {
3608             this.m = Objects.requireNonNull(m);
3609             this.keyType = Objects.requireNonNull(keyType);
3610             this.valueType = Objects.requireNonNull(valueType);
3611         }
3612 
3613         public int size()                      { return m.size(); }
3614         public boolean isEmpty()               { return m.isEmpty(); }
3615         public boolean containsKey(Object key) { return m.containsKey(key); }
3616         public boolean containsValue(Object v) { return m.containsValue(v); }
3617         public V get(Object key)               { return m.get(key); }
3618         public V remove(Object key)            { return m.remove(key); }
3619         public void clear()                    { m.clear(); }
3620         public Set<K> keySet()                 { return m.keySet(); }
3621         public Collection<V> values()          { return m.values(); }
3622         public boolean equals(Object o)        { return o == this || m.equals(o); }
3623         public int hashCode()                  { return m.hashCode(); }
3624         public String toString()               { return m.toString(); }
3625 
3626         public V put(K key, V value) {
3627             typeCheck(key, value);
3628             return m.put(key, value);
3629         }
3630 
3631         @SuppressWarnings("unchecked")
3632         public void putAll(Map<? extends K, ? extends V> t) {
3633             // Satisfy the following goals:
3634             // - good diagnostics in case of type mismatch
3635             // - all-or-nothing semantics
3636             // - protection from malicious t
3637             // - correct behavior if t is a concurrent map
3638             Object[] entries = t.entrySet().toArray();
3639             List<Map.Entry<K,V>> checked = new ArrayList<>(entries.length);
3640             for (Object o : entries) {
3641                 Map.Entry<?,?> e = (Map.Entry<?,?>) o;
3642                 Object k = e.getKey();
3643                 Object v = e.getValue();
3644                 typeCheck(k, v);
3645                 checked.add(
3646                         new AbstractMap.SimpleImmutableEntry<>((K)k, (V)v));
3647             }
3648             for (Map.Entry<K,V> e : checked)
3649                 m.put(e.getKey(), e.getValue());
3650         }
3651 
3652         private transient Set<Map.Entry<K,V>> entrySet;
3653 
3654         public Set<Map.Entry<K,V>> entrySet() {
3655             if (entrySet==null)
3656                 entrySet = new CheckedEntrySet<>(m.entrySet(), valueType);
3657             return entrySet;
3658         }
3659 
3660         // Override default methods in Map
3661         @Override
3662         public void forEach(BiConsumer<? super K, ? super V> action) {
3663             m.forEach(action);
3664         }
3665 
3666         @Override
3667         public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
3668             m.replaceAll(typeCheck(function));
3669         }
3670 
3671         @Override
3672         public V putIfAbsent(K key, V value) {
3673             typeCheck(key, value);
3674             return m.putIfAbsent(key, value);
3675         }
3676 
3677         @Override
3678         public boolean remove(Object key, Object value) {
3679             return m.remove(key, value);
3680         }
3681 
3682         @Override
3683         public boolean replace(K key, V oldValue, V newValue) {
3684             typeCheck(key, newValue);
3685             return m.replace(key, oldValue, newValue);
3686         }
3687 
3688         @Override
3689         public V replace(K key, V value) {
3690             typeCheck(key, value);
3691             return m.replace(key, value);
3692         }
3693 
3694         @Override
3695         public V computeIfAbsent(K key,
3696                 Function<? super K, ? extends V> mappingFunction) {
3697             Objects.requireNonNull(mappingFunction);
3698             return m.computeIfAbsent(key, k -> {
3699                 V value = mappingFunction.apply(k);
3700                 typeCheck(k, value);
3701                 return value;
3702             });
3703         }
3704 
3705         @Override
3706         public V computeIfPresent(K key,
3707                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
3708             return m.computeIfPresent(key, typeCheck(remappingFunction));
3709         }
3710 
3711         @Override
3712         public V compute(K key,
3713                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
3714             return m.compute(key, typeCheck(remappingFunction));
3715         }
3716 
3717         @Override
3718         public V merge(K key, V value,
3719                 BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
3720             Objects.requireNonNull(remappingFunction);
3721             return m.merge(key, value, (v1, v2) -> {
3722                 V newValue = remappingFunction.apply(v1, v2);
3723                 typeCheck(null, newValue);
3724                 return newValue;
3725             });
3726         }
3727 
3728         /**
3729          * We need this class in addition to CheckedSet as Map.Entry permits
3730          * modification of the backing Map via the setValue operation.  This
3731          * class is subtle: there are many possible attacks that must be
3732          * thwarted.
3733          *
3734          * @serial exclude
3735          */
3736         static class CheckedEntrySet<K,V> implements Set<Map.Entry<K,V>> {
3737             private final Set<Map.Entry<K,V>> s;
3738             private final Class<V> valueType;
3739 
3740             CheckedEntrySet(Set<Map.Entry<K, V>> s, Class<V> valueType) {
3741                 this.s = s;
3742                 this.valueType = valueType;
3743             }
3744 
3745             public int size()        { return s.size(); }
3746             public boolean isEmpty() { return s.isEmpty(); }
3747             public String toString() { return s.toString(); }
3748             public int hashCode()    { return s.hashCode(); }
3749             public void clear()      {        s.clear(); }
3750 
3751             public boolean add(Map.Entry<K, V> e) {
3752                 throw new UnsupportedOperationException();
3753             }
3754             public boolean addAll(Collection<? extends Map.Entry<K, V>> coll) {
3755                 throw new UnsupportedOperationException();
3756             }
3757 
3758             public Iterator<Map.Entry<K,V>> iterator() {
3759                 final Iterator<Map.Entry<K, V>> i = s.iterator();
3760                 final Class<V> valueType = this.valueType;
3761 
3762                 return new Iterator<Map.Entry<K,V>>() {
3763                     public boolean hasNext() { return i.hasNext(); }
3764                     public void remove()     { i.remove(); }
3765 
3766                     public Map.Entry<K,V> next() {
3767                         return checkedEntry(i.next(), valueType);
3768                     }
3769                 };
3770             }
3771 
3772             @SuppressWarnings("unchecked")
3773             public Object[] toArray() {
3774                 Object[] source = s.toArray();
3775 
3776                 /*
3777                  * Ensure that we don't get an ArrayStoreException even if
3778                  * s.toArray returns an array of something other than Object
3779                  */
3780                 Object[] dest = (CheckedEntry.class.isInstance(
3781                     source.getClass().getComponentType()) ? source :
3782                                  new Object[source.length]);
3783 
3784                 for (int i = 0; i < source.length; i++)
3785                     dest[i] = checkedEntry((Map.Entry<K,V>)source[i],
3786                                            valueType);
3787                 return dest;
3788             }
3789 
3790             @SuppressWarnings("unchecked")
3791             public <T> T[] toArray(T[] a) {
3792                 // We don't pass a to s.toArray, to avoid window of
3793                 // vulnerability wherein an unscrupulous multithreaded client
3794                 // could get his hands on raw (unwrapped) Entries from s.
3795                 T[] arr = s.toArray(a.length==0 ? a : Arrays.copyOf(a, 0));
3796 
3797                 for (int i=0; i<arr.length; i++)
3798                     arr[i] = (T) checkedEntry((Map.Entry<K,V>)arr[i],
3799                                               valueType);
3800                 if (arr.length > a.length)
3801                     return arr;
3802 
3803                 System.arraycopy(arr, 0, a, 0, arr.length);
3804                 if (a.length > arr.length)
3805                     a[arr.length] = null;
3806                 return a;
3807             }
3808 
3809             /**
3810              * This method is overridden to protect the backing set against
3811              * an object with a nefarious equals function that senses
3812              * that the equality-candidate is Map.Entry and calls its
3813              * setValue method.
3814              */
3815             public boolean contains(Object o) {
3816                 if (!(o instanceof Map.Entry))
3817                     return false;
3818                 Map.Entry<?,?> e = (Map.Entry<?,?>) o;
3819                 return s.contains(
3820                     (e instanceof CheckedEntry) ? e : checkedEntry(e, valueType));
3821             }
3822 
3823             /**
3824              * The bulk collection methods are overridden to protect
3825              * against an unscrupulous collection whose contains(Object o)
3826              * method senses when o is a Map.Entry, and calls o.setValue.
3827              */
3828             public boolean containsAll(Collection<?> c) {
3829                 for (Object o : c)
3830                     if (!contains(o)) // Invokes safe contains() above
3831                         return false;
3832                 return true;
3833             }
3834 
3835             public boolean remove(Object o) {
3836                 if (!(o instanceof Map.Entry))
3837                     return false;
3838                 return s.remove(new AbstractMap.SimpleImmutableEntry
3839                                 <>((Map.Entry<?,?>)o));
3840             }
3841 
3842             public boolean removeAll(Collection<?> c) {
3843                 return batchRemove(c, false);
3844             }
3845             public boolean retainAll(Collection<?> c) {
3846                 return batchRemove(c, true);
3847             }
3848             private boolean batchRemove(Collection<?> c, boolean complement) {
3849                 Objects.requireNonNull(c);
3850                 boolean modified = false;
3851                 Iterator<Map.Entry<K,V>> it = iterator();
3852                 while (it.hasNext()) {
3853                     if (c.contains(it.next()) != complement) {
3854                         it.remove();
3855                         modified = true;
3856                     }
3857                 }
3858                 return modified;
3859             }
3860 
3861             public boolean equals(Object o) {
3862                 if (o == this)
3863                     return true;
3864                 if (!(o instanceof Set))
3865                     return false;
3866                 Set<?> that = (Set<?>) o;
3867                 return that.size() == s.size()
3868                     && containsAll(that); // Invokes safe containsAll() above
3869             }
3870 
3871             static <K,V,T> CheckedEntry<K,V,T> checkedEntry(Map.Entry<K,V> e,
3872                                                             Class<T> valueType) {
3873                 return new CheckedEntry<>(e, valueType);
3874             }
3875 
3876             /**
3877              * This "wrapper class" serves two purposes: it prevents
3878              * the client from modifying the backing Map, by short-circuiting
3879              * the setValue method, and it protects the backing Map against
3880              * an ill-behaved Map.Entry that attempts to modify another
3881              * Map.Entry when asked to perform an equality check.
3882              */
3883             private static class CheckedEntry<K,V,T> implements Map.Entry<K,V> {
3884                 private final Map.Entry<K, V> e;
3885                 private final Class<T> valueType;
3886 
3887                 CheckedEntry(Map.Entry<K, V> e, Class<T> valueType) {
3888                     this.e = Objects.requireNonNull(e);
3889                     this.valueType = Objects.requireNonNull(valueType);
3890                 }
3891 
3892                 public K getKey()        { return e.getKey(); }
3893                 public V getValue()      { return e.getValue(); }
3894                 public int hashCode()    { return e.hashCode(); }
3895                 public String toString() { return e.toString(); }
3896 
3897                 public V setValue(V value) {
3898                     if (value != null && !valueType.isInstance(value))
3899                         throw new ClassCastException(badValueMsg(value));
3900                     return e.setValue(value);
3901                 }
3902 
3903                 private String badValueMsg(Object value) {
3904                     return "Attempt to insert " + value.getClass() +
3905                         " value into map with value type " + valueType;
3906                 }
3907 
3908                 public boolean equals(Object o) {
3909                     if (o == this)
3910                         return true;
3911                     if (!(o instanceof Map.Entry))
3912                         return false;
3913                     return e.equals(new AbstractMap.SimpleImmutableEntry
3914                                     <>((Map.Entry<?,?>)o));
3915                 }
3916             }
3917         }
3918     }
3919 
3920     /**
3921      * Returns a dynamically typesafe view of the specified sorted map.
3922      * Any attempt to insert a mapping whose key or value have the wrong
3923      * type will result in an immediate {@link ClassCastException}.
3924      * Similarly, any attempt to modify the value currently associated with
3925      * a key will result in an immediate {@link ClassCastException},
3926      * whether the modification is attempted directly through the map
3927      * itself, or through a {@link Map.Entry} instance obtained from the
3928      * map's {@link Map#entrySet() entry set} view.
3929      *
3930      * <p>Assuming a map contains no incorrectly typed keys or values
3931      * prior to the time a dynamically typesafe view is generated, and
3932      * that all subsequent access to the map takes place through the view
3933      * (or one of its collection views), it is <i>guaranteed</i> that the
3934      * map cannot contain an incorrectly typed key or value.
3935      *
3936      * <p>A discussion of the use of dynamically typesafe views may be
3937      * found in the documentation for the {@link #checkedCollection
3938      * checkedCollection} method.
3939      *
3940      * <p>The returned map will be serializable if the specified map is
3941      * serializable.
3942      *
3943      * <p>Since {@code null} is considered to be a value of any reference
3944      * type, the returned map permits insertion of null keys or values
3945      * whenever the backing map does.
3946      *
3947      * @param <K> the class of the map keys
3948      * @param <V> the class of the map values
3949      * @param m the map for which a dynamically typesafe view is to be
3950      *          returned
3951      * @param keyType the type of key that {@code m} is permitted to hold
3952      * @param valueType the type of value that {@code m} is permitted to hold
3953      * @return a dynamically typesafe view of the specified map
3954      * @since 1.5
3955      */
3956     public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m,
3957                                                         Class<K> keyType,
3958                                                         Class<V> valueType) {
3959         return new CheckedSortedMap<>(m, keyType, valueType);
3960     }
3961 
3962     /**
3963      * @serial include
3964      */
3965     static class CheckedSortedMap<K,V> extends CheckedMap<K,V>
3966         implements SortedMap<K,V>, Serializable
3967     {
3968         private static final long serialVersionUID = 1599671320688067438L;
3969 
3970         private final SortedMap<K, V> sm;
3971 
3972         CheckedSortedMap(SortedMap<K, V> m,
3973                          Class<K> keyType, Class<V> valueType) {
3974             super(m, keyType, valueType);
3975             sm = m;
3976         }
3977 
3978         public Comparator<? super K> comparator() { return sm.comparator(); }
3979         public K firstKey()                       { return sm.firstKey(); }
3980         public K lastKey()                        { return sm.lastKey(); }
3981 
3982         public SortedMap<K,V> subMap(K fromKey, K toKey) {
3983             return checkedSortedMap(sm.subMap(fromKey, toKey),
3984                                     keyType, valueType);
3985         }
3986         public SortedMap<K,V> headMap(K toKey) {
3987             return checkedSortedMap(sm.headMap(toKey), keyType, valueType);
3988         }
3989         public SortedMap<K,V> tailMap(K fromKey) {
3990             return checkedSortedMap(sm.tailMap(fromKey), keyType, valueType);
3991         }
3992     }
3993 
3994     /**
3995      * Returns a dynamically typesafe view of the specified navigable map.
3996      * Any attempt to insert a mapping whose key or value have the wrong
3997      * type will result in an immediate {@link ClassCastException}.
3998      * Similarly, any attempt to modify the value currently associated with
3999      * a key will result in an immediate {@link ClassCastException},
4000      * whether the modification is attempted directly through the map
4001      * itself, or through a {@link Map.Entry} instance obtained from the
4002      * map's {@link Map#entrySet() entry set} view.
4003      *
4004      * <p>Assuming a map contains no incorrectly typed keys or values
4005      * prior to the time a dynamically typesafe view is generated, and
4006      * that all subsequent access to the map takes place through the view
4007      * (or one of its collection views), it is <em>guaranteed</em> that the
4008      * map cannot contain an incorrectly typed key or value.
4009      *
4010      * <p>A discussion of the use of dynamically typesafe views may be
4011      * found in the documentation for the {@link #checkedCollection
4012      * checkedCollection} method.
4013      *
4014      * <p>The returned map will be serializable if the specified map is
4015      * serializable.
4016      *
4017      * <p>Since {@code null} is considered to be a value of any reference
4018      * type, the returned map permits insertion of null keys or values
4019      * whenever the backing map does.
4020      *
4021      * @param <K> type of map keys
4022      * @param <V> type of map values
4023      * @param m the map for which a dynamically typesafe view is to be
4024      *          returned
4025      * @param keyType the type of key that {@code m} is permitted to hold
4026      * @param valueType the type of value that {@code m} is permitted to hold
4027      * @return a dynamically typesafe view of the specified map
4028      * @since 1.8
4029      */
4030     public static <K,V> NavigableMap<K,V> checkedNavigableMap(NavigableMap<K, V> m,
4031                                                         Class<K> keyType,
4032                                                         Class<V> valueType) {
4033         return new CheckedNavigableMap<>(m, keyType, valueType);
4034     }
4035 
4036     /**
4037      * @serial include
4038      */
4039     static class CheckedNavigableMap<K,V> extends CheckedSortedMap<K,V>
4040         implements NavigableMap<K,V>, Serializable
4041     {
4042         private static final long serialVersionUID = -4852462692372534096L;
4043 
4044         private final NavigableMap<K, V> nm;
4045 
4046         CheckedNavigableMap(NavigableMap<K, V> m,
4047                          Class<K> keyType, Class<V> valueType) {
4048             super(m, keyType, valueType);
4049             nm = m;
4050         }
4051 
4052         public Comparator<? super K> comparator()   { return nm.comparator(); }
4053         public K firstKey()                           { return nm.firstKey(); }
4054         public K lastKey()                             { return nm.lastKey(); }
4055 
4056         public Entry<K, V> lowerEntry(K key) {
4057             Entry<K,V> lower = nm.lowerEntry(key);
4058             return (null != lower)
4059                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(lower, valueType)
4060                 : null;
4061         }
4062 
4063         public K lowerKey(K key)                   { return nm.lowerKey(key); }
4064 
4065         public Entry<K, V> floorEntry(K key) {
4066             Entry<K,V> floor = nm.floorEntry(key);
4067             return (null != floor)
4068                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(floor, valueType)
4069                 : null;
4070         }
4071 
4072         public K floorKey(K key)                   { return nm.floorKey(key); }
4073 
4074         public Entry<K, V> ceilingEntry(K key) {
4075             Entry<K,V> ceiling = nm.ceilingEntry(key);
4076             return (null != ceiling)
4077                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(ceiling, valueType)
4078                 : null;
4079         }
4080 
4081         public K ceilingKey(K key)               { return nm.ceilingKey(key); }
4082 
4083         public Entry<K, V> higherEntry(K key) {
4084             Entry<K,V> higher = nm.higherEntry(key);
4085             return (null != higher)
4086                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(higher, valueType)
4087                 : null;
4088         }
4089 
4090         public K higherKey(K key)                 { return nm.higherKey(key); }
4091 
4092         public Entry<K, V> firstEntry() {
4093             Entry<K,V> first = nm.firstEntry();
4094             return (null != first)
4095                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(first, valueType)
4096                 : null;
4097         }
4098 
4099         public Entry<K, V> lastEntry() {
4100             Entry<K,V> last = nm.lastEntry();
4101             return (null != last)
4102                 ? new CheckedMap.CheckedEntrySet.CheckedEntry<>(last, valueType)
4103                 : null;
4104         }
4105 
4106         public Entry<K, V> pollFirstEntry() {
4107             Entry<K,V> entry = nm.pollFirstEntry();
4108             return (null == entry)
4109                 ? null
4110                 : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
4111         }
4112 
4113         public Entry<K, V> pollLastEntry() {
4114             Entry<K,V> entry = nm.pollLastEntry();
4115             return (null == entry)
4116                 ? null
4117                 : new CheckedMap.CheckedEntrySet.CheckedEntry<>(entry, valueType);
4118         }
4119 
4120         public NavigableMap<K, V> descendingMap() {
4121             return checkedNavigableMap(nm.descendingMap(), keyType, valueType);
4122         }
4123 
4124         public NavigableSet<K> keySet() {
4125             return navigableKeySet();
4126         }
4127 
4128         public NavigableSet<K> navigableKeySet() {
4129             return checkedNavigableSet(nm.navigableKeySet(), keyType);
4130         }
4131 
4132         public NavigableSet<K> descendingKeySet() {
4133             return checkedNavigableSet(nm.descendingKeySet(), keyType);
4134         }
4135 
4136         @Override
4137         public NavigableMap<K,V> subMap(K fromKey, K toKey) {
4138             return checkedNavigableMap(nm.subMap(fromKey, true, toKey, false),
4139                                     keyType, valueType);
4140         }
4141 
4142         @Override
4143         public NavigableMap<K,V> headMap(K toKey) {
4144             return checkedNavigableMap(nm.headMap(toKey, false), keyType, valueType);
4145         }
4146 
4147         @Override
4148         public NavigableMap<K,V> tailMap(K fromKey) {
4149             return checkedNavigableMap(nm.tailMap(fromKey, true), keyType, valueType);
4150         }
4151 
4152         public NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) {
4153             return checkedNavigableMap(nm.subMap(fromKey, fromInclusive, toKey, toInclusive), keyType, valueType);
4154         }
4155 
4156         public NavigableMap<K, V> headMap(K toKey, boolean inclusive) {
4157             return checkedNavigableMap(nm.headMap(toKey, inclusive), keyType, valueType);
4158         }
4159 
4160         public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) {
4161             return checkedNavigableMap(nm.tailMap(fromKey, inclusive), keyType, valueType);
4162         }
4163     }
4164 
4165     // Empty collections
4166 
4167     /**
4168      * Returns an iterator that has no elements.  More precisely,
4169      *
4170      * <ul>
4171      * <li>{@link Iterator#hasNext hasNext} always returns {@code
4172      * false}.</li>
4173      * <li>{@link Iterator#next next} always throws {@link
4174      * NoSuchElementException}.</li>
4175      * <li>{@link Iterator#remove remove} always throws {@link
4176      * IllegalStateException}.</li>
4177      * </ul>
4178      *
4179      * <p>Implementations of this method are permitted, but not
4180      * required, to return the same object from multiple invocations.
4181      *
4182      * @param <T> type of elements, if there were any, in the iterator
4183      * @return an empty iterator
4184      * @since 1.7
4185      */
4186     @SuppressWarnings("unchecked")
4187     public static <T> Iterator<T> emptyIterator() {
4188         return (Iterator<T>) EmptyIterator.EMPTY_ITERATOR;
4189     }
4190 
4191     private static class EmptyIterator<E> implements Iterator<E> {
4192         static final EmptyIterator<Object> EMPTY_ITERATOR
4193             = new EmptyIterator<>();
4194 
4195         public boolean hasNext() { return false; }
4196         public E next() { throw new NoSuchElementException(); }
4197         public void remove() { throw new IllegalStateException(); }
4198         @Override
4199         public void forEachRemaining(Consumer<? super E> action) {
4200             Objects.requireNonNull(action);
4201         }
4202     }
4203 
4204     /**
4205      * Returns a list iterator that has no elements.  More precisely,
4206      *
4207      * <ul>
4208      * <li>{@link Iterator#hasNext hasNext} and {@link
4209      * ListIterator#hasPrevious hasPrevious} always return {@code
4210      * false}.</li>
4211      * <li>{@link Iterator#next next} and {@link ListIterator#previous
4212      * previous} always throw {@link NoSuchElementException}.</li>
4213      * <li>{@link Iterator#remove remove} and {@link ListIterator#set
4214      * set} always throw {@link IllegalStateException}.</li>
4215      * <li>{@link ListIterator#add add} always throws {@link
4216      * UnsupportedOperationException}.</li>
4217      * <li>{@link ListIterator#nextIndex nextIndex} always returns
4218      * {@code 0}.</li>
4219      * <li>{@link ListIterator#previousIndex previousIndex} always
4220      * returns {@code -1}.</li>
4221      * </ul>
4222      *
4223      * <p>Implementations of this method are permitted, but not
4224      * required, to return the same object from multiple invocations.
4225      *
4226      * @param <T> type of elements, if there were any, in the iterator
4227      * @return an empty list iterator
4228      * @since 1.7
4229      */
4230     @SuppressWarnings("unchecked")
4231     public static <T> ListIterator<T> emptyListIterator() {
4232         return (ListIterator<T>) EmptyListIterator.EMPTY_ITERATOR;
4233     }
4234 
4235     private static class EmptyListIterator<E>
4236         extends EmptyIterator<E>
4237         implements ListIterator<E>
4238     {
4239         static final EmptyListIterator<Object> EMPTY_ITERATOR
4240             = new EmptyListIterator<>();
4241 
4242         public boolean hasPrevious() { return false; }
4243         public E previous() { throw new NoSuchElementException(); }
4244         public int nextIndex()     { return 0; }
4245         public int previousIndex() { return -1; }
4246         public void set(E e) { throw new IllegalStateException(); }
4247         public void add(E e) { throw new UnsupportedOperationException(); }
4248     }
4249 
4250     /**
4251      * Returns an enumeration that has no elements.  More precisely,
4252      *
4253      * <ul>
4254      * <li>{@link Enumeration#hasMoreElements hasMoreElements} always
4255      * returns {@code false}.</li>
4256      * <li> {@link Enumeration#nextElement nextElement} always throws
4257      * {@link NoSuchElementException}.</li>
4258      * </ul>
4259      *
4260      * <p>Implementations of this method are permitted, but not
4261      * required, to return the same object from multiple invocations.
4262      *
4263      * @param  <T> the class of the objects in the enumeration
4264      * @return an empty enumeration
4265      * @since 1.7
4266      */
4267     @SuppressWarnings("unchecked")
4268     public static <T> Enumeration<T> emptyEnumeration() {
4269         return (Enumeration<T>) EmptyEnumeration.EMPTY_ENUMERATION;
4270     }
4271 
4272     private static class EmptyEnumeration<E> implements Enumeration<E> {
4273         static final EmptyEnumeration<Object> EMPTY_ENUMERATION
4274             = new EmptyEnumeration<>();
4275 
4276         public boolean hasMoreElements() { return false; }
4277         public E nextElement() { throw new NoSuchElementException(); }
4278     }
4279 
4280     /**
4281      * The empty set (immutable).  This set is serializable.
4282      *
4283      * @see #emptySet()
4284      */
4285     @SuppressWarnings("rawtypes")
4286     public static final Set EMPTY_SET = new EmptySet<>();
4287 
4288     /**
4289      * Returns an empty set (immutable).  This set is serializable.
4290      * Unlike the like-named field, this method is parameterized.
4291      *
4292      * <p>This example illustrates the type-safe way to obtain an empty set:
4293      * <pre>
4294      *     Set&lt;String&gt; s = Collections.emptySet();
4295      * </pre>
4296      * @implNote Implementations of this method need not create a separate
4297      * {@code Set} object for each call.  Using this method is likely to have
4298      * comparable cost to using the like-named field.  (Unlike this method, the
4299      * field does not provide type safety.)
4300      *
4301      * @param  <T> the class of the objects in the set
4302      * @return the empty set
4303      *
4304      * @see #EMPTY_SET
4305      * @since 1.5
4306      */
4307     @SuppressWarnings("unchecked")
4308     public static final <T> Set<T> emptySet() {
4309         return (Set<T>) EMPTY_SET;
4310     }
4311 
4312     /**
4313      * @serial include
4314      */
4315     private static class EmptySet<E>
4316         extends AbstractSet<E>
4317         implements Serializable
4318     {
4319         private static final long serialVersionUID = 1582296315990362920L;
4320 
4321         public Iterator<E> iterator() { return emptyIterator(); }
4322 
4323         public int size() {return 0;}
4324         public boolean isEmpty() {return true;}
4325 
4326         public boolean contains(Object obj) {return false;}
4327         public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
4328 
4329         public Object[] toArray() { return new Object[0]; }
4330 
4331         public <T> T[] toArray(T[] a) {
4332             if (a.length > 0)
4333                 a[0] = null;
4334             return a;
4335         }
4336 
4337         // Override default methods in Collection
4338         @Override
4339         public void forEach(Consumer<? super E> action) {
4340             Objects.requireNonNull(action);
4341         }
4342         @Override
4343         public boolean removeIf(Predicate<? super E> filter) {
4344             Objects.requireNonNull(filter);
4345             return false;
4346         }
4347         @Override
4348         public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }
4349 
4350         // Preserves singleton property
4351         private Object readResolve() {
4352             return EMPTY_SET;
4353         }
4354     }
4355 
4356     /**
4357      * Returns an empty sorted set (immutable).  This set is serializable.
4358      *
4359      * <p>This example illustrates the type-safe way to obtain an empty
4360      * sorted set:
4361      * <pre> {@code
4362      *     SortedSet<String> s = Collections.emptySortedSet();
4363      * }</pre>
4364      *
4365      * @implNote Implementations of this method need not create a separate
4366      * {@code SortedSet} object for each call.
4367      *
4368      * @param <E> type of elements, if there were any, in the set
4369      * @return the empty sorted set
4370      * @since 1.8
4371      */
4372     @SuppressWarnings("unchecked")
4373     public static <E> SortedSet<E> emptySortedSet() {
4374         return (SortedSet<E>) UnmodifiableNavigableSet.EMPTY_NAVIGABLE_SET;
4375     }
4376 
4377     /**
4378      * Returns an empty navigable set (immutable).  This set is serializable.
4379      *
4380      * <p>This example illustrates the type-safe way to obtain an empty
4381      * navigable set:
4382      * <pre> {@code
4383      *     NavigableSet<String> s = Collections.emptyNavigableSet();
4384      * }</pre>
4385      *
4386      * @implNote Implementations of this method need not
4387      * create a separate {@code NavigableSet} object for each call.
4388      *
4389      * @param <E> type of elements, if there were any, in the set
4390      * @return the empty navigable set
4391      * @since 1.8
4392      */
4393     @SuppressWarnings("unchecked")
4394     public static <E> NavigableSet<E> emptyNavigableSet() {
4395         return (NavigableSet<E>) UnmodifiableNavigableSet.EMPTY_NAVIGABLE_SET;
4396     }
4397 
4398     /**
4399      * The empty list (immutable).  This list is serializable.
4400      *
4401      * @see #emptyList()
4402      */
4403     @SuppressWarnings("rawtypes")
4404     public static final List EMPTY_LIST = new EmptyList<>();
4405 
4406     /**
4407      * Returns an empty list (immutable).  This list is serializable.
4408      *
4409      * <p>This example illustrates the type-safe way to obtain an empty list:
4410      * <pre>
4411      *     List&lt;String&gt; s = Collections.emptyList();
4412      * </pre>
4413      *
4414      * @implNote
4415      * Implementations of this method need not create a separate <tt>List</tt>
4416      * object for each call.   Using this method is likely to have comparable
4417      * cost to using the like-named field.  (Unlike this method, the field does
4418      * not provide type safety.)
4419      *
4420      * @param <T> type of elements, if there were any, in the list
4421      * @return an empty immutable list
4422      *
4423      * @see #EMPTY_LIST
4424      * @since 1.5
4425      */
4426     @SuppressWarnings("unchecked")
4427     public static final <T> List<T> emptyList() {
4428         return (List<T>) EMPTY_LIST;
4429     }
4430 
4431     /**
4432      * @serial include
4433      */
4434     private static class EmptyList<E>
4435         extends AbstractList<E>
4436         implements RandomAccess, Serializable {
4437         private static final long serialVersionUID = 8842843931221139166L;
4438 
4439         public Iterator<E> iterator() {
4440             return emptyIterator();
4441         }
4442         public ListIterator<E> listIterator() {
4443             return emptyListIterator();
4444         }
4445 
4446         public int size() {return 0;}
4447         public boolean isEmpty() {return true;}
4448 
4449         public boolean contains(Object obj) {return false;}
4450         public boolean containsAll(Collection<?> c) { return c.isEmpty(); }
4451 
4452         public Object[] toArray() { return new Object[0]; }
4453 
4454         public <T> T[] toArray(T[] a) {
4455             if (a.length > 0)
4456                 a[0] = null;
4457             return a;
4458         }
4459 
4460         public E get(int index) {
4461             throw new IndexOutOfBoundsException("Index: "+index);
4462         }
4463 
4464         public boolean equals(Object o) {
4465             return (o instanceof List) && ((List<?>)o).isEmpty();
4466         }
4467 
4468         public int hashCode() { return 1; }
4469 
4470         @Override
4471         public boolean removeIf(Predicate<? super E> filter) {
4472             Objects.requireNonNull(filter);
4473             return false;
4474         }
4475         @Override
4476         public void replaceAll(UnaryOperator<E> operator) {
4477             Objects.requireNonNull(operator);
4478         }
4479         @Override
4480         public void sort(Comparator<? super E> c) {
4481         }
4482 
4483         // Override default methods in Collection
4484         @Override
4485         public void forEach(Consumer<? super E> action) {
4486             Objects.requireNonNull(action);
4487         }
4488 
4489         @Override
4490         public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); }
4491 
4492         // Preserves singleton property
4493         private Object readResolve() {
4494             return EMPTY_LIST;
4495         }
4496     }
4497 
4498     /**
4499      * The empty map (immutable).  This map is serializable.
4500      *
4501      * @see #emptyMap()
4502      * @since 1.3
4503      */
4504     @SuppressWarnings("rawtypes")
4505     public static final Map EMPTY_MAP = new EmptyMap<>();
4506 
4507     /**
4508      * Returns an empty map (immutable).  This map is serializable.
4509      *
4510      * <p>This example illustrates the type-safe way to obtain an empty map:
4511      * <pre>
4512      *     Map&lt;String, Date&gt; s = Collections.emptyMap();
4513      * </pre>
4514      * @implNote Implementations of this method need not create a separate
4515      * {@code Map} object for each call.  Using this method is likely to have
4516      * comparable cost to using the like-named field.  (Unlike this method, the
4517      * field does not provide type safety.)
4518      *
4519      * @param <K> the class of the map keys
4520      * @param <V> the class of the map values
4521      * @return an empty map
4522      * @see #EMPTY_MAP
4523      * @since 1.5
4524      */
4525     @SuppressWarnings("unchecked")
4526     public static final <K,V> Map<K,V> emptyMap() {
4527         return (Map<K,V>) EMPTY_MAP;
4528     }
4529 
4530     /**
4531      * Returns an empty sorted map (immutable).  This map is serializable.
4532      *
4533      * <p>This example illustrates the type-safe way to obtain an empty map:
4534      * <pre> {@code
4535      *     SortedMap<String, Date> s = Collections.emptySortedMap();
4536      * }</pre>
4537      *
4538      * @implNote Implementations of this method need not create a separate
4539      * {@code SortedMap} object for each call.
4540      *
4541      * @param <K> the class of the map keys
4542      * @param <V> the class of the map values
4543      * @return an empty sorted map
4544      * @since 1.8
4545      */
4546     @SuppressWarnings("unchecked")
4547     public static final <K,V> SortedMap<K,V> emptySortedMap() {
4548         return (SortedMap<K,V>) UnmodifiableNavigableMap.EMPTY_NAVIGABLE_MAP;
4549     }
4550 
4551     /**
4552      * Returns an empty navigable map (immutable).  This map is serializable.
4553      *
4554      * <p>This example illustrates the type-safe way to obtain an empty map:
4555      * <pre> {@code
4556      *     NavigableMap<String, Date> s = Collections.emptyNavigableMap();
4557      * }</pre>
4558      *
4559      * @implNote Implementations of this method need not create a separate
4560      * {@code NavigableMap} object for each call.
4561      *
4562      * @param <K> the class of the map keys
4563      * @param <V> the class of the map values
4564      * @return an empty navigable map
4565      * @since 1.8
4566      */
4567     @SuppressWarnings("unchecked")
4568     public static final <K,V> NavigableMap<K,V> emptyNavigableMap() {
4569         return (NavigableMap<K,V>) UnmodifiableNavigableMap.EMPTY_NAVIGABLE_MAP;
4570     }
4571 
4572     /**
4573      * @serial include
4574      */
4575     private static class EmptyMap<K,V>
4576         extends AbstractMap<K,V>
4577         implements Serializable
4578     {
4579         private static final long serialVersionUID = 6428348081105594320L;
4580 
4581         public int size()                          {return 0;}
4582         public boolean isEmpty()                   {return true;}
4583         public boolean containsKey(Object key)     {return false;}
4584         public boolean containsValue(Object value) {return false;}
4585         public V get(Object key)                   {return null;}
4586         public Set<K> keySet()                     {return emptySet();}
4587         public Collection<V> values()              {return emptySet();}
4588         public Set<Map.Entry<K,V>> entrySet()      {return emptySet();}
4589 
4590         public boolean equals(Object o) {
4591             return (o instanceof Map) && ((Map<?,?>)o).isEmpty();
4592         }
4593 
4594         public int hashCode()                      {return 0;}
4595 
4596         // Override default methods in Map
4597         @Override
4598         @SuppressWarnings("unchecked")
4599         public V getOrDefault(Object k, V defaultValue) {
4600             return defaultValue;
4601         }
4602 
4603         @Override
4604         public void forEach(BiConsumer<? super K, ? super V> action) {
4605             Objects.requireNonNull(action);
4606         }
4607 
4608         @Override
4609         public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
4610             Objects.requireNonNull(function);
4611         }
4612 
4613         @Override
4614         public V putIfAbsent(K key, V value) {
4615             throw new UnsupportedOperationException();
4616         }
4617 
4618         @Override
4619         public boolean remove(Object key, Object value) {
4620             throw new UnsupportedOperationException();
4621         }
4622 
4623         @Override
4624         public boolean replace(K key, V oldValue, V newValue) {
4625             throw new UnsupportedOperationException();
4626         }
4627 
4628         @Override
4629         public V replace(K key, V value) {
4630             throw new UnsupportedOperationException();
4631         }
4632 
4633         @Override
4634         public V computeIfAbsent(K key,
4635                 Function<? super K, ? extends V> mappingFunction) {
4636             throw new UnsupportedOperationException();
4637         }
4638 
4639         @Override
4640         public V computeIfPresent(K key,
4641                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
4642             throw new UnsupportedOperationException();
4643         }
4644 
4645         @Override
4646         public V compute(K key,
4647                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
4648             throw new UnsupportedOperationException();
4649         }
4650 
4651         @Override
4652         public V merge(K key, V value,
4653                 BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
4654             throw new UnsupportedOperationException();
4655         }
4656 
4657         // Preserves singleton property
4658         private Object readResolve() {
4659             return EMPTY_MAP;
4660         }
4661     }
4662 
4663     // Singleton collections
4664 
4665     /**
4666      * Returns an immutable set containing only the specified object.
4667      * The returned set is serializable.
4668      *
4669      * @param  <T> the class of the objects in the set
4670      * @param o the sole object to be stored in the returned set.
4671      * @return an immutable set containing only the specified object.
4672      */
4673     public static <T> Set<T> singleton(T o) {
4674         return new SingletonSet<>(o);
4675     }
4676 
4677     static <E> Iterator<E> singletonIterator(final E e) {
4678         return new Iterator<E>() {
4679             private boolean hasNext = true;
4680             public boolean hasNext() {
4681                 return hasNext;
4682             }
4683             public E next() {
4684                 if (hasNext) {
4685                     hasNext = false;
4686                     return e;
4687                 }
4688                 throw new NoSuchElementException();
4689             }
4690             public void remove() {
4691                 throw new UnsupportedOperationException();
4692             }
4693             @Override
4694             public void forEachRemaining(Consumer<? super E> action) {
4695                 Objects.requireNonNull(action);
4696                 if (hasNext) {
4697                     action.accept(e);
4698                     hasNext = false;
4699                 }
4700             }
4701         };
4702     }
4703 
4704     /**
4705      * Creates a {@code Spliterator} with only the specified element
4706      *
4707      * @param <T> Type of elements
4708      * @return A singleton {@code Spliterator}
4709      */
4710     static <T> Spliterator<T> singletonSpliterator(final T element) {
4711         return new Spliterator<T>() {
4712             long est = 1;
4713 
4714             @Override
4715             public Spliterator<T> trySplit() {
4716                 return null;
4717             }
4718 
4719             @Override
4720             public boolean tryAdvance(Consumer<? super T> consumer) {
4721                 Objects.requireNonNull(consumer);
4722                 if (est > 0) {
4723                     est--;
4724                     consumer.accept(element);
4725                     return true;
4726                 }
4727                 return false;
4728             }
4729 
4730             @Override
4731             public void forEachRemaining(Consumer<? super T> consumer) {
4732                 tryAdvance(consumer);
4733             }
4734 
4735             @Override
4736             public long estimateSize() {
4737                 return est;
4738             }
4739 
4740             @Override
4741             public int characteristics() {
4742                 int value = (element != null) ? Spliterator.NONNULL : 0;
4743 
4744                 return value | Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.IMMUTABLE |
4745                        Spliterator.DISTINCT | Spliterator.ORDERED;
4746             }
4747         };
4748     }
4749 
4750     /**
4751      * @serial include
4752      */
4753     private static class SingletonSet<E>
4754         extends AbstractSet<E>
4755         implements Serializable
4756     {
4757         private static final long serialVersionUID = 3193687207550431679L;
4758 
4759         private final E element;
4760 
4761         SingletonSet(E e) {element = e;}
4762 
4763         public Iterator<E> iterator() {
4764             return singletonIterator(element);
4765         }
4766 
4767         public int size() {return 1;}
4768 
4769         public boolean contains(Object o) {return eq(o, element);}
4770 
4771         // Override default methods for Collection
4772         @Override
4773         public void forEach(Consumer<? super E> action) {
4774             action.accept(element);
4775         }
4776         @Override
4777         public Spliterator<E> spliterator() {
4778             return singletonSpliterator(element);
4779         }
4780         @Override
4781         public boolean removeIf(Predicate<? super E> filter) {
4782             throw new UnsupportedOperationException();
4783         }
4784     }
4785 
4786     /**
4787      * Returns an immutable list containing only the specified object.
4788      * The returned list is serializable.
4789      *
4790      * @param  <T> the class of the objects in the list
4791      * @param o the sole object to be stored in the returned list.
4792      * @return an immutable list containing only the specified object.
4793      * @since 1.3
4794      */
4795     public static <T> List<T> singletonList(T o) {
4796         return new SingletonList<>(o);
4797     }
4798 
4799     /**
4800      * @serial include
4801      */
4802     private static class SingletonList<E>
4803         extends AbstractList<E>
4804         implements RandomAccess, Serializable {
4805 
4806         private static final long serialVersionUID = 3093736618740652951L;
4807 
4808         private final E element;
4809 
4810         SingletonList(E obj)                {element = obj;}
4811 
4812         public Iterator<E> iterator() {
4813             return singletonIterator(element);
4814         }
4815 
4816         public int size()                   {return 1;}
4817 
4818         public boolean contains(Object obj) {return eq(obj, element);}
4819 
4820         public E get(int index) {
4821             if (index != 0)
4822               throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
4823             return element;
4824         }
4825 
4826         // Override default methods for Collection
4827         @Override
4828         public void forEach(Consumer<? super E> action) {
4829             action.accept(element);
4830         }
4831         @Override
4832         public boolean removeIf(Predicate<? super E> filter) {
4833             throw new UnsupportedOperationException();
4834         }
4835         @Override
4836         public void replaceAll(UnaryOperator<E> operator) {
4837             throw new UnsupportedOperationException();
4838         }
4839         @Override
4840         public void sort(Comparator<? super E> c) {
4841         }
4842         @Override
4843         public Spliterator<E> spliterator() {
4844             return singletonSpliterator(element);
4845         }
4846     }
4847 
4848     /**
4849      * Returns an immutable map, mapping only the specified key to the
4850      * specified value.  The returned map is serializable.
4851      *
4852      * @param <K> the class of the map keys
4853      * @param <V> the class of the map values
4854      * @param key the sole key to be stored in the returned map.
4855      * @param value the value to which the returned map maps <tt>key</tt>.
4856      * @return an immutable map containing only the specified key-value
4857      *         mapping.
4858      * @since 1.3
4859      */
4860     public static <K,V> Map<K,V> singletonMap(K key, V value) {
4861         return new SingletonMap<>(key, value);
4862     }
4863 
4864     /**
4865      * @serial include
4866      */
4867     private static class SingletonMap<K,V>
4868           extends AbstractMap<K,V>
4869           implements Serializable {
4870         private static final long serialVersionUID = -6979724477215052911L;
4871 
4872         private final K k;
4873         private final V v;
4874 
4875         SingletonMap(K key, V value) {
4876             k = key;
4877             v = value;
4878         }
4879 
4880         public int size()                                           {return 1;}
4881         public boolean isEmpty()                                {return false;}
4882         public boolean containsKey(Object key)             {return eq(key, k);}
4883         public boolean containsValue(Object value)       {return eq(value, v);}
4884         public V get(Object key)              {return (eq(key, k) ? v : null);}
4885 
4886         private transient Set<K> keySet;
4887         private transient Set<Map.Entry<K,V>> entrySet;
4888         private transient Collection<V> values;
4889 
4890         public Set<K> keySet() {
4891             if (keySet==null)
4892                 keySet = singleton(k);
4893             return keySet;
4894         }
4895 
4896         public Set<Map.Entry<K,V>> entrySet() {
4897             if (entrySet==null)
4898                 entrySet = Collections.<Map.Entry<K,V>>singleton(
4899                     new SimpleImmutableEntry<>(k, v));
4900             return entrySet;
4901         }
4902 
4903         public Collection<V> values() {
4904             if (values==null)
4905                 values = singleton(v);
4906             return values;
4907         }
4908 
4909         // Override default methods in Map
4910         @Override
4911         public V getOrDefault(Object key, V defaultValue) {
4912             return eq(key, k) ? v : defaultValue;
4913         }
4914 
4915         @Override
4916         public void forEach(BiConsumer<? super K, ? super V> action) {
4917             action.accept(k, v);
4918         }
4919 
4920         @Override
4921         public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
4922             throw new UnsupportedOperationException();
4923         }
4924 
4925         @Override
4926         public V putIfAbsent(K key, V value) {
4927             throw new UnsupportedOperationException();
4928         }
4929 
4930         @Override
4931         public boolean remove(Object key, Object value) {
4932             throw new UnsupportedOperationException();
4933         }
4934 
4935         @Override
4936         public boolean replace(K key, V oldValue, V newValue) {
4937             throw new UnsupportedOperationException();
4938         }
4939 
4940         @Override
4941         public V replace(K key, V value) {
4942             throw new UnsupportedOperationException();
4943         }
4944 
4945         @Override
4946         public V computeIfAbsent(K key,
4947                 Function<? super K, ? extends V> mappingFunction) {
4948             throw new UnsupportedOperationException();
4949         }
4950 
4951         @Override
4952         public V computeIfPresent(K key,
4953                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
4954             throw new UnsupportedOperationException();
4955         }
4956 
4957         @Override
4958         public V compute(K key,
4959                 BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
4960             throw new UnsupportedOperationException();
4961         }
4962 
4963         @Override
4964         public V merge(K key, V value,
4965                 BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
4966             throw new UnsupportedOperationException();
4967         }
4968     }
4969 
4970     // Miscellaneous
4971 
4972     /**
4973      * Returns an immutable list consisting of <tt>n</tt> copies of the
4974      * specified object.  The newly allocated data object is tiny (it contains
4975      * a single reference to the data object).  This method is useful in
4976      * combination with the <tt>List.addAll</tt> method to grow lists.
4977      * The returned list is serializable.
4978      *
4979      * @param  <T> the class of the object to copy and of the objects
4980      *         in the returned list.
4981      * @param  n the number of elements in the returned list.
4982      * @param  o the element to appear repeatedly in the returned list.
4983      * @return an immutable list consisting of <tt>n</tt> copies of the
4984      *         specified object.
4985      * @throws IllegalArgumentException if {@code n < 0}
4986      * @see    List#addAll(Collection)
4987      * @see    List#addAll(int, Collection)
4988      */
4989     public static <T> List<T> nCopies(int n, T o) {
4990         if (n < 0)
4991             throw new IllegalArgumentException("List length = " + n);
4992         return new CopiesList<>(n, o);
4993     }
4994 
4995     /**
4996      * @serial include
4997      */
4998     private static class CopiesList<E>
4999         extends AbstractList<E>
5000         implements RandomAccess, Serializable
5001     {
5002         private static final long serialVersionUID = 2739099268398711800L;
5003 
5004         final int n;
5005         final E element;
5006 
5007         CopiesList(int n, E e) {
5008             assert n >= 0;
5009             this.n = n;
5010             element = e;
5011         }
5012 
5013         public int size() {
5014             return n;
5015         }
5016 
5017         public boolean contains(Object obj) {
5018             return n != 0 && eq(obj, element);
5019         }
5020 
5021         public int indexOf(Object o) {
5022             return contains(o) ? 0 : -1;
5023         }
5024 
5025         public int lastIndexOf(Object o) {
5026             return contains(o) ? n - 1 : -1;
5027         }
5028 
5029         public E get(int index) {
5030             if (index < 0 || index >= n)
5031                 throw new IndexOutOfBoundsException("Index: "+index+
5032                                                     ", Size: "+n);
5033             return element;
5034         }
5035 
5036         public Object[] toArray() {
5037             final Object[] a = new Object[n];
5038             if (element != null)
5039                 Arrays.fill(a, 0, n, element);
5040             return a;
5041         }
5042 
5043         @SuppressWarnings("unchecked")
5044         public <T> T[] toArray(T[] a) {
5045             final int n = this.n;
5046             if (a.length < n) {
5047                 a = (T[])java.lang.reflect.Array
5048                     .newInstance(a.getClass().getComponentType(), n);
5049                 if (element != null)
5050                     Arrays.fill(a, 0, n, element);
5051             } else {
5052                 Arrays.fill(a, 0, n, element);
5053                 if (a.length > n)
5054                     a[n] = null;
5055             }
5056             return a;
5057         }
5058 
5059         public List<E> subList(int fromIndex, int toIndex) {
5060             if (fromIndex < 0)
5061                 throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
5062             if (toIndex > n)
5063                 throw new IndexOutOfBoundsException("toIndex = " + toIndex);
5064             if (fromIndex > toIndex)
5065                 throw new IllegalArgumentException("fromIndex(" + fromIndex +
5066                                                    ") > toIndex(" + toIndex + ")");
5067             return new CopiesList<>(toIndex - fromIndex, element);
5068         }
5069 
5070         // Override default methods in Collection
5071         @Override
5072         public Stream<E> stream() {
5073             return IntStream.range(0, n).mapToObj(i -> element);
5074         }
5075 
5076         @Override
5077         public Stream<E> parallelStream() {
5078             return IntStream.range(0, n).parallel().mapToObj(i -> element);
5079         }
5080 
5081         @Override
5082         public Spliterator<E> spliterator() {
5083             return stream().spliterator();
5084         }
5085     }
5086 
5087     /**
5088      * Returns a comparator that imposes the reverse of the <em>natural
5089      * ordering</em> on a collection of objects that implement the
5090      * {@code Comparable} interface.  (The natural ordering is the ordering
5091      * imposed by the objects' own {@code compareTo} method.)  This enables a
5092      * simple idiom for sorting (or maintaining) collections (or arrays) of
5093      * objects that implement the {@code Comparable} interface in
5094      * reverse-natural-order.  For example, suppose {@code a} is an array of
5095      * strings. Then: <pre>
5096      *          Arrays.sort(a, Collections.reverseOrder());
5097      * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
5098      *
5099      * The returned comparator is serializable.
5100      *
5101      * @param  <T> the class of the objects compared by the comparator
5102      * @return A comparator that imposes the reverse of the <i>natural
5103      *         ordering</i> on a collection of objects that implement
5104      *         the <tt>Comparable</tt> interface.
5105      * @see Comparable
5106      */
5107     @SuppressWarnings("unchecked")
5108     public static <T> Comparator<T> reverseOrder() {
5109         return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
5110     }
5111 
5112     /**
5113      * @serial include
5114      */
5115     private static class ReverseComparator
5116         implements Comparator<Comparable<Object>>, Serializable {
5117 
5118         private static final long serialVersionUID = 7207038068494060240L;
5119 
5120         static final ReverseComparator REVERSE_ORDER
5121             = new ReverseComparator();
5122 
5123         public int compare(Comparable<Object> c1, Comparable<Object> c2) {
5124             return c2.compareTo(c1);
5125         }
5126 
5127         private Object readResolve() { return Collections.reverseOrder(); }
5128 
5129         @Override
5130         public Comparator<Comparable<Object>> reversed() {
5131             return Comparator.naturalOrder();
5132         }
5133     }
5134 
5135     /**
5136      * Returns a comparator that imposes the reverse ordering of the specified
5137      * comparator.  If the specified comparator is {@code null}, this method is
5138      * equivalent to {@link #reverseOrder()} (in other words, it returns a
5139      * comparator that imposes the reverse of the <em>natural ordering</em> on
5140      * a collection of objects that implement the Comparable interface).
5141      *
5142      * <p>The returned comparator is serializable (assuming the specified
5143      * comparator is also serializable or {@code null}).
5144      *
5145      * @param <T> the class of the objects compared by the comparator
5146      * @param cmp a comparator who's ordering is to be reversed by the returned
5147      * comparator or {@code null}
5148      * @return A comparator that imposes the reverse ordering of the
5149      *         specified comparator.
5150      * @since 1.5
5151      */
5152     public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
5153         if (cmp == null)
5154             return reverseOrder();
5155 
5156         if (cmp instanceof ReverseComparator2)
5157             return ((ReverseComparator2<T>)cmp).cmp;
5158 
5159         return new ReverseComparator2<>(cmp);
5160     }
5161 
5162     /**
5163      * @serial include
5164      */
5165     private static class ReverseComparator2<T> implements Comparator<T>,
5166         Serializable
5167     {
5168         private static final long serialVersionUID = 4374092139857L;
5169 
5170         /**
5171          * The comparator specified in the static factory.  This will never
5172          * be null, as the static factory returns a ReverseComparator
5173          * instance if its argument is null.
5174          *
5175          * @serial
5176          */
5177         final Comparator<T> cmp;
5178 
5179         ReverseComparator2(Comparator<T> cmp) {
5180             assert cmp != null;
5181             this.cmp = cmp;
5182         }
5183 
5184         public int compare(T t1, T t2) {
5185             return cmp.compare(t2, t1);
5186         }
5187 
5188         public boolean equals(Object o) {
5189             return (o == this) ||
5190                 (o instanceof ReverseComparator2 &&
5191                  cmp.equals(((ReverseComparator2)o).cmp));
5192         }
5193 
5194         public int hashCode() {
5195             return cmp.hashCode() ^ Integer.MIN_VALUE;
5196         }
5197 
5198         @Override
5199         public Comparator<T> reversed() {
5200             return cmp;
5201         }
5202     }
5203 
5204     /**
5205      * Returns an enumeration over the specified collection.  This provides
5206      * interoperability with legacy APIs that require an enumeration
5207      * as input.
5208      *
5209      * @param  <T> the class of the objects in the collection
5210      * @param c the collection for which an enumeration is to be returned.
5211      * @return an enumeration over the specified collection.
5212      * @see Enumeration
5213      */
5214     public static <T> Enumeration<T> enumeration(final Collection<T> c) {
5215         return new Enumeration<T>() {
5216             private final Iterator<T> i = c.iterator();
5217 
5218             public boolean hasMoreElements() {
5219                 return i.hasNext();
5220             }
5221 
5222             public T nextElement() {
5223                 return i.next();
5224             }
5225         };
5226     }
5227 
5228     /**
5229      * Returns an array list containing the elements returned by the
5230      * specified enumeration in the order they are returned by the
5231      * enumeration.  This method provides interoperability between
5232      * legacy APIs that return enumerations and new APIs that require
5233      * collections.
5234      *
5235      * @param <T> the class of the objects returned by the enumeration
5236      * @param e enumeration providing elements for the returned
5237      *          array list
5238      * @return an array list containing the elements returned
5239      *         by the specified enumeration.
5240      * @since 1.4
5241      * @see Enumeration
5242      * @see ArrayList
5243      */
5244     public static <T> ArrayList<T> list(Enumeration<T> e) {
5245         ArrayList<T> l = new ArrayList<>();
5246         while (e.hasMoreElements())
5247             l.add(e.nextElement());
5248         return l;
5249     }
5250 
5251     /**
5252      * Returns true if the specified arguments are equal, or both null.
5253      *
5254      * NB: Do not replace with Object.equals until JDK-8015417 is resolved.
5255      */
5256     static boolean eq(Object o1, Object o2) {
5257         return o1==null ? o2==null : o1.equals(o2);
5258     }
5259 
5260     /**
5261      * Returns the number of elements in the specified collection equal to the
5262      * specified object.  More formally, returns the number of elements
5263      * <tt>e</tt> in the collection such that
5264      * <tt>(o == null ? e == null : o.equals(e))</tt>.
5265      *
5266      * @param c the collection in which to determine the frequency
5267      *     of <tt>o</tt>
5268      * @param o the object whose frequency is to be determined
5269      * @return the number of elements in {@code c} equal to {@code o}
5270      * @throws NullPointerException if <tt>c</tt> is null
5271      * @since 1.5
5272      */
5273     public static int frequency(Collection<?> c, Object o) {
5274         int result = 0;
5275         if (o == null) {
5276             for (Object e : c)
5277                 if (e == null)
5278                     result++;
5279         } else {
5280             for (Object e : c)
5281                 if (o.equals(e))
5282                     result++;
5283         }
5284         return result;
5285     }
5286 
5287     /**
5288      * Returns {@code true} if the two specified collections have no
5289      * elements in common.
5290      *
5291      * <p>Care must be exercised if this method is used on collections that
5292      * do not comply with the general contract for {@code Collection}.
5293      * Implementations may elect to iterate over either collection and test
5294      * for containment in the other collection (or to perform any equivalent
5295      * computation).  If either collection uses a nonstandard equality test
5296      * (as does a {@link SortedSet} whose ordering is not <em>compatible with
5297      * equals</em>, or the key set of an {@link IdentityHashMap}), both
5298      * collections must use the same nonstandard equality test, or the
5299      * result of this method is undefined.
5300      *
5301      * <p>Care must also be exercised when using collections that have
5302      * restrictions on the elements that they may contain. Collection
5303      * implementations are allowed to throw exceptions for any operation
5304      * involving elements they deem ineligible. For absolute safety the
5305      * specified collections should contain only elements which are
5306      * eligible elements for both collections.
5307      *
5308      * <p>Note that it is permissible to pass the same collection in both
5309      * parameters, in which case the method will return {@code true} if and
5310      * only if the collection is empty.
5311      *
5312      * @param c1 a collection
5313      * @param c2 a collection
5314      * @return {@code true} if the two specified collections have no
5315      * elements in common.
5316      * @throws NullPointerException if either collection is {@code null}.
5317      * @throws NullPointerException if one collection contains a {@code null}
5318      * element and {@code null} is not an eligible element for the other collection.
5319      * (<a href="Collection.html#optional-restrictions">optional</a>)
5320      * @throws ClassCastException if one collection contains an element that is
5321      * of a type which is ineligible for the other collection.
5322      * (<a href="Collection.html#optional-restrictions">optional</a>)
5323      * @since 1.5
5324      */
5325     public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
5326         // The collection to be used for contains(). Preference is given to
5327         // the collection who's contains() has lower O() complexity.
5328         Collection<?> contains = c2;
5329         // The collection to be iterated. If the collections' contains() impl
5330         // are of different O() complexity, the collection with slower
5331         // contains() will be used for iteration. For collections who's
5332         // contains() are of the same complexity then best performance is
5333         // achieved by iterating the smaller collection.
5334         Collection<?> iterate = c1;
5335 
5336         // Performance optimization cases. The heuristics:
5337         //   1. Generally iterate over c1.
5338         //   2. If c1 is a Set then iterate over c2.
5339         //   3. If either collection is empty then result is always true.
5340         //   4. Iterate over the smaller Collection.
5341         if (c1 instanceof Set) {
5342             // Use c1 for contains as a Set's contains() is expected to perform
5343             // better than O(N/2)
5344             iterate = c2;
5345             contains = c1;
5346         } else if (!(c2 instanceof Set)) {
5347             // Both are mere Collections. Iterate over smaller collection.
5348             // Example: If c1 contains 3 elements and c2 contains 50 elements and
5349             // assuming contains() requires ceiling(N/2) comparisons then
5350             // checking for all c1 elements in c2 would require 75 comparisons
5351             // (3 * ceiling(50/2)) vs. checking all c2 elements in c1 requiring
5352             // 100 comparisons (50 * ceiling(3/2)).
5353             int c1size = c1.size();
5354             int c2size = c2.size();
5355             if (c1size == 0 || c2size == 0) {
5356                 // At least one collection is empty. Nothing will match.
5357                 return true;
5358             }
5359 
5360             if (c1size > c2size) {
5361                 iterate = c2;
5362                 contains = c1;
5363             }
5364         }
5365 
5366         for (Object e : iterate) {
5367             if (contains.contains(e)) {
5368                // Found a common element. Collections are not disjoint.
5369                 return false;
5370             }
5371         }
5372 
5373         // No common elements were found.
5374         return true;
5375     }
5376 
5377     /**
5378      * Adds all of the specified elements to the specified collection.
5379      * Elements to be added may be specified individually or as an array.
5380      * The behavior of this convenience method is identical to that of
5381      * <tt>c.addAll(Arrays.asList(elements))</tt>, but this method is likely
5382      * to run significantly faster under most implementations.
5383      *
5384      * <p>When elements are specified individually, this method provides a
5385      * convenient way to add a few elements to an existing collection:
5386      * <pre>
5387      *     Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon");
5388      * </pre>
5389      *
5390      * @param  <T> the class of the elements to add and of the collection
5391      * @param c the collection into which <tt>elements</tt> are to be inserted
5392      * @param elements the elements to insert into <tt>c</tt>
5393      * @return <tt>true</tt> if the collection changed as a result of the call
5394      * @throws UnsupportedOperationException if <tt>c</tt> does not support
5395      *         the <tt>add</tt> operation
5396      * @throws NullPointerException if <tt>elements</tt> contains one or more
5397      *         null values and <tt>c</tt> does not permit null elements, or
5398      *         if <tt>c</tt> or <tt>elements</tt> are <tt>null</tt>
5399      * @throws IllegalArgumentException if some property of a value in
5400      *         <tt>elements</tt> prevents it from being added to <tt>c</tt>
5401      * @see Collection#addAll(Collection)
5402      * @since 1.5
5403      */
5404     @SafeVarargs
5405     public static <T> boolean addAll(Collection<? super T> c, T... elements) {
5406         boolean result = false;
5407         for (T element : elements)
5408             result |= c.add(element);
5409         return result;
5410     }
5411 
5412     /**
5413      * Returns a set backed by the specified map.  The resulting set displays
5414      * the same ordering, concurrency, and performance characteristics as the
5415      * backing map.  In essence, this factory method provides a {@link Set}
5416      * implementation corresponding to any {@link Map} implementation.  There
5417      * is no need to use this method on a {@link Map} implementation that
5418      * already has a corresponding {@link Set} implementation (such as {@link
5419      * HashMap} or {@link TreeMap}).
5420      *
5421      * <p>Each method invocation on the set returned by this method results in
5422      * exactly one method invocation on the backing map or its <tt>keySet</tt>
5423      * view, with one exception.  The <tt>addAll</tt> method is implemented
5424      * as a sequence of <tt>put</tt> invocations on the backing map.
5425      *
5426      * <p>The specified map must be empty at the time this method is invoked,
5427      * and should not be accessed directly after this method returns.  These
5428      * conditions are ensured if the map is created empty, passed directly
5429      * to this method, and no reference to the map is retained, as illustrated
5430      * in the following code fragment:
5431      * <pre>
5432      *    Set&lt;Object&gt; weakHashSet = Collections.newSetFromMap(
5433      *        new WeakHashMap&lt;Object, Boolean&gt;());
5434      * </pre>
5435      *
5436      * @param <E> the class of the map keys and of the objects in the
5437      *        returned set
5438      * @param map the backing map
5439      * @return the set backed by the map
5440      * @throws IllegalArgumentException if <tt>map</tt> is not empty
5441      * @since 1.6
5442      */
5443     public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
5444         return new SetFromMap<>(map);
5445     }
5446 
5447     /**
5448      * @serial include
5449      */
5450     private static class SetFromMap<E> extends AbstractSet<E>
5451         implements Set<E>, Serializable
5452     {
5453         private final Map<E, Boolean> m;  // The backing map
5454         private transient Set<E> s;       // Its keySet
5455 
5456         SetFromMap(Map<E, Boolean> map) {
5457             if (!map.isEmpty())
5458                 throw new IllegalArgumentException("Map is non-empty");
5459             m = map;
5460             s = map.keySet();
5461         }
5462 
5463         public void clear()               {        m.clear(); }
5464         public int size()                 { return m.size(); }
5465         public boolean isEmpty()          { return m.isEmpty(); }
5466         public boolean contains(Object o) { return m.containsKey(o); }
5467         public boolean remove(Object o)   { return m.remove(o) != null; }
5468         public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
5469         public Iterator<E> iterator()     { return s.iterator(); }
5470         public Object[] toArray()         { return s.toArray(); }
5471         public <T> T[] toArray(T[] a)     { return s.toArray(a); }
5472         public String toString()          { return s.toString(); }
5473         public int hashCode()             { return s.hashCode(); }
5474         public boolean equals(Object o)   { return o == this || s.equals(o); }
5475         public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
5476         public boolean removeAll(Collection<?> c)   {return s.removeAll(c);}
5477         public boolean retainAll(Collection<?> c)   {return s.retainAll(c);}
5478         // addAll is the only inherited implementation
5479 
5480         // Override default methods in Collection
5481         @Override
5482         public void forEach(Consumer<? super E> action) {
5483             s.forEach(action);
5484         }
5485         @Override
5486         public boolean removeIf(Predicate<? super E> filter) {
5487             return s.removeIf(filter);
5488         }
5489 
5490         @Override
5491         public Spliterator<E> spliterator() {return s.spliterator();}
5492         @Override
5493         public Stream<E> stream()           {return s.stream();}
5494         @Override
5495         public Stream<E> parallelStream()   {return s.parallelStream();}
5496 
5497         private static final long serialVersionUID = 2454657854757543876L;
5498 
5499         private void readObject(java.io.ObjectInputStream stream)
5500             throws IOException, ClassNotFoundException
5501         {
5502             stream.defaultReadObject();
5503             s = m.keySet();
5504         }
5505     }
5506 
5507     /**
5508      * Returns a view of a {@link Deque} as a Last-in-first-out (Lifo)
5509      * {@link Queue}. Method <tt>add</tt> is mapped to <tt>push</tt>,
5510      * <tt>remove</tt> is mapped to <tt>pop</tt> and so on. This
5511      * view can be useful when you would like to use a method
5512      * requiring a <tt>Queue</tt> but you need Lifo ordering.
5513      *
5514      * <p>Each method invocation on the queue returned by this method
5515      * results in exactly one method invocation on the backing deque, with
5516      * one exception.  The {@link Queue#addAll addAll} method is
5517      * implemented as a sequence of {@link Deque#addFirst addFirst}
5518      * invocations on the backing deque.
5519      *
5520      * @param  <T> the class of the objects in the deque
5521      * @param deque the deque
5522      * @return the queue
5523      * @since  1.6
5524      */
5525     public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
5526         return new AsLIFOQueue<>(deque);
5527     }
5528 
5529     /**
5530      * @serial include
5531      */
5532     static class AsLIFOQueue<E> extends AbstractQueue<E>
5533         implements Queue<E>, Serializable {
5534         private static final long serialVersionUID = 1802017725587941708L;
5535         private final Deque<E> q;
5536         AsLIFOQueue(Deque<E> q)           { this.q = q; }
5537         public boolean add(E e)           { q.addFirst(e); return true; }
5538         public boolean offer(E e)         { return q.offerFirst(e); }
5539         public E poll()                   { return q.pollFirst(); }
5540         public E remove()                 { return q.removeFirst(); }
5541         public E peek()                   { return q.peekFirst(); }
5542         public E element()                { return q.getFirst(); }
5543         public void clear()               {        q.clear(); }
5544         public int size()                 { return q.size(); }
5545         public boolean isEmpty()          { return q.isEmpty(); }
5546         public boolean contains(Object o) { return q.contains(o); }
5547         public boolean remove(Object o)   { return q.remove(o); }
5548         public Iterator<E> iterator()     { return q.iterator(); }
5549         public Object[] toArray()         { return q.toArray(); }
5550         public <T> T[] toArray(T[] a)     { return q.toArray(a); }
5551         public String toString()          { return q.toString(); }
5552         public boolean containsAll(Collection<?> c) {return q.containsAll(c);}
5553         public boolean removeAll(Collection<?> c)   {return q.removeAll(c);}
5554         public boolean retainAll(Collection<?> c)   {return q.retainAll(c);}
5555         // We use inherited addAll; forwarding addAll would be wrong
5556 
5557         // Override default methods in Collection
5558         @Override
5559         public void forEach(Consumer<? super E> action) {q.forEach(action);}
5560         @Override
5561         public boolean removeIf(Predicate<? super E> filter) {
5562             return q.removeIf(filter);
5563         }
5564         @Override
5565         public Spliterator<E> spliterator() {return q.spliterator();}
5566         @Override
5567         public Stream<E> stream()           {return q.stream();}
5568         @Override
5569         public Stream<E> parallelStream()   {return q.parallelStream();}
5570     }
5571 }