zoukankan      html  css  js  c++  java
  • JDK1.8源码Collections

    正文:

    一、概述:

    此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。

    如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都将抛出 NullPointerException

    此类中所含多态算法的文档通常包括对实现 的简短描述。应该将这类描述视为实现注意事项,而不是规范 的一部分。实现者应该可以随意使用其他算法替代,只要遵循规范本身即可。(例如,sort 使用的算法不一定是合并排序算法,但它必须是稳定的。)

    此类中包含的“破坏性”算法,即可修改其所操作的 collection 的算法,该算法被指定在 collection 不支持适当的可变基元(比如 set 方法)时抛出 UnsupportedOperationException。如果调用不会对 collection 产生任何影响,那么这些算法可能(但不要求)抛出此异常。例如,在已经排序的、不可修改列表上调用 sort 方法可能会(也可能不会)抛出 UnsupportedOperationException。 

    二、拓展点

    1,<T> Comparator<T> reverseOrder()分析

    源码解释:
    返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序
    (自然顺序是通过对象自身的 compareTo 方法强行排序的。)
    此方法允许使用单个语句,以逆自然顺序对实现了 Comparable 接口的对象 collection(或数组)进行排序(或维护)。
    例如,假设 a 是一个字符串数组。那么:
    Arrays.sort(a, Collections.reverseOrder());
    将按照逆字典(字母)顺序对数组进行排序。
     1     /**
     2      * Returns a comparator that imposes the reverse of the <em>natural
     3      * ordering</em> on a collection of objects that implement the
     4      * {@code Comparable} interface.  (The natural ordering is the ordering
     5      * imposed by the objects' own {@code compareTo} method.)  This enables a
     6      * simple idiom for sorting (or maintaining) collections (or arrays) of
     7      * objects that implement the {@code Comparable} interface in
     8      * reverse-natural-order.  For example, suppose {@code a} is an array of
     9      * strings. Then: <pre>
    10      *          Arrays.sort(a, Collections.reverseOrder());
    11      * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
    12      *
    13      * The returned comparator is serializable.
    14      *
    15      * @param  <T> the class of the objects compared by the comparator
    16      * @return A comparator that imposes the reverse of the <i>natural
    17      *         ordering</i> on a collection of objects that implement
    18      *         the <tt>Comparable</tt> interface.
    19      * @see Comparable
    20      */
    21     @SuppressWarnings("unchecked")
    22     public static <T> Comparator<T> reverseOrder() {
    23         return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
    24     }
    25 
    26     /**
    27      * @serial include
    28      */
    29     private static class ReverseComparator
    30         implements Comparator<Comparable<Object>>, Serializable {
    31 
    32         private static final long serialVersionUID = 7207038068494060240L;
    33 
    34         static final ReverseComparator REVERSE_ORDER
    35             = new ReverseComparator();
    36 
    37         public int compare(Comparable<Object> c1, Comparable<Object> c2) {
    38             return c2.compareTo(c1);
    39         }
    40 
    41         private Object readResolve() { return Collections.reverseOrder(); }
    42 
    43         @Override
    44         public Comparator<Comparable<Object>> reversed() {
    45             return Comparator.naturalOrder();
    46         }
    47     }

    示例:

     1    public static void main(String[] args) {
     2         List<Integer> list = new ArrayList<Integer>();
     3         list.add(1);
     4         list.add(5);
     5         list.add(2);
     6         list.add(3);
     7         list.add(6);
     8         list.add(4);
     9         list.add(7);
    10         System.out.println("原顺序:"+list);
    11         Collections.sort(list);
    12         Comparator<Object> objectComparator = Collections.reverseOrder();
    13         Collections.sort(list,objectComparator);
    14         System.out.println("逆转后顺序:"+list);
    15     }

    结果:

    1 原顺序:[1, 5, 2, 3, 6, 4, 7]
    2 逆转后顺序:[7, 6, 5, 4, 3, 2, 1]

    在调用Collections.reverseOrder() 方法时调用了内部类的构造方法创建 ReverseComparator,

    只有在调用 Collections.sort(list,objectComparator)时,逆转比较器作为参数,将调用内部的方法

    1         public int compare(Comparable<Object> c1, Comparable<Object> c2) {
    2             return c2.compareTo(c1);
    3         }

    该方法才是顺序逆转的核心!

    三、其他源码:

       1 public class Collections {
       2     // Suppresses default constructor, ensuring non-instantiability.
       3     private Collections() {
       4     }
       5 
       6     // Algorithms
       7 
       8     /*
       9      * Tuning parameters for algorithms - Many of the List algorithms have
      10      * two implementations, one of which is appropriate for RandomAccess
      11      * lists, the other for "sequential."  Often, the random access variant
      12      * yields better performance on small sequential access lists.  The
      13      * tuning parameters below determine the cutoff point for what constitutes
      14      * a "small" sequential access list for each algorithm.  The values below
      15      * were empirically determined to work well for LinkedList. Hopefully
      16      * they should be reasonable for other sequential access List
      17      * implementations.  Those doing performance work on this code would
      18      * do well to validate the values of these parameters from time to time.
      19      * (The first word of each tuning parameter name is the algorithm to which
      20      * it applies.)
      21      */
      22     private static final int BINARYSEARCH_THRESHOLD   = 5000;
      23     private static final int REVERSE_THRESHOLD        =   18;
      24     private static final int SHUFFLE_THRESHOLD        =    5;
      25     private static final int FILL_THRESHOLD           =   25;
      26     private static final int ROTATE_THRESHOLD         =  100;
      27     private static final int COPY_THRESHOLD           =   10;
      28     private static final int REPLACEALL_THRESHOLD     =   11;
      29     private static final int INDEXOFSUBLIST_THRESHOLD =   35;
      30 
      31     /**
      32      * Sorts the specified list into ascending order, according to the
      33      * {@linkplain Comparable natural ordering} of its elements.
      34      * All elements in the list must implement the {@link Comparable}
      35      * interface.  Furthermore, all elements in the list must be
      36      * <i>mutually comparable</i> (that is, {@code e1.compareTo(e2)}
      37      * must not throw a {@code ClassCastException} for any elements
      38      * {@code e1} and {@code e2} in the list).
      39      *
      40      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
      41      * not be reordered as a result of the sort.
      42      *
      43      * <p>The specified list must be modifiable, but need not be resizable.
      44      *
      45      * @implNote
      46      * This implementation defers to the {@link List#sort(Comparator)}
      47      * method using the specified list and a {@code null} comparator.
      48      *
      49      * @param  <T> the class of the objects in the list
      50      * @param  list the list to be sorted.
      51      * @throws ClassCastException if the list contains elements that are not
      52      *         <i>mutually comparable</i> (for example, strings and integers).
      53      * @throws UnsupportedOperationException if the specified list's
      54      *         list-iterator does not support the {@code set} operation.
      55      * @throws IllegalArgumentException (optional) if the implementation
      56      *         detects that the natural ordering of the list elements is
      57      *         found to violate the {@link Comparable} contract
      58      * @see List#sort(Comparator)
      59      */
      60     //根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口 
      61     @SuppressWarnings("unchecked")
      62     public static <T extends Comparable<? super T>> void sort(List<T> list) {
      63         list.sort(null);
      64     }
      65 
      66     /**
      67      * Sorts the specified list according to the order induced by the
      68      * specified comparator.  All elements in the list must be <i>mutually
      69      * comparable</i> using the specified comparator (that is,
      70      * {@code c.compare(e1, e2)} must not throw a {@code ClassCastException}
      71      * for any elements {@code e1} and {@code e2} in the list).
      72      *
      73      * <p>This sort is guaranteed to be <i>stable</i>:  equal elements will
      74      * not be reordered as a result of the sort.
      75      *
      76      * <p>The specified list must be modifiable, but need not be resizable.
      77      *
      78      * @implNote
      79      * This implementation defers to the {@link List#sort(Comparator)}
      80      * method using the specified list and comparator.
      81      *
      82      * @param  <T> the class of the objects in the list
      83      * @param  list the list to be sorted.
      84      * @param  c the comparator to determine the order of the list.  A
      85      *        {@code null} value indicates that the elements' <i>natural
      86      *        ordering</i> should be used.
      87      * @throws ClassCastException if the list contains elements that are not
      88      *         <i>mutually comparable</i> using the specified comparator.
      89      * @throws UnsupportedOperationException if the specified list's
      90      *         list-iterator does not support the {@code set} operation.
      91      * @throws IllegalArgumentException (optional) if the comparator is
      92      *         found to violate the {@link Comparator} contract
      93      * @see List#sort(Comparator)
      94      */
      95     //根据指定比较器产生的顺序对指定列表进行排序。 
      96     @SuppressWarnings({"unchecked", "rawtypes"})
      97     public static <T> void sort(List<T> list, Comparator<? super T> c) {
      98         list.sort(c);
      99     }
     100 
     101 
     102     /**
     103      * Searches the specified list for the specified object using the binary
     104      * search algorithm.  The list must be sorted into ascending order
     105      * according to the {@linkplain Comparable natural ordering} of its
     106      * elements (as by the {@link #sort(List)} method) prior to making this
     107      * call.  If it is not sorted, the results are undefined.  If the list
     108      * contains multiple elements equal to the specified object, there is no
     109      * guarantee which one will be found.
     110      *
     111      * <p>This method runs in log(n) time for a "random access" list (which
     112      * provides near-constant-time positional access).  If the specified list
     113      * does not implement the {@link RandomAccess} interface and is large,
     114      * this method will do an iterator-based binary search that performs
     115      * O(n) link traversals and O(log n) element comparisons.
     116      *
     117      * @param  <T> the class of the objects in the list
     118      * @param  list the list to be searched.
     119      * @param  key the key to be searched for.
     120      * @return the index of the search key, if it is contained in the list;
     121      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
     122      *         <i>insertion point</i> is defined as the point at which the
     123      *         key would be inserted into the list: the index of the first
     124      *         element greater than the key, or <tt>list.size()</tt> if all
     125      *         elements in the list are less than the specified key.  Note
     126      *         that this guarantees that the return value will be &gt;= 0 if
     127      *         and only if the key is found.
     128      * @throws ClassCastException if the list contains elements that are not
     129      *         <i>mutually comparable</i> (for example, strings and
     130      *         integers), or the search key is not mutually comparable
     131      *         with the elements of the list.
     132      */
     133     //使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过 sort(List) //方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。 
     134     public static <T>
     135     int binarySearch(List<? extends Comparable<? super T>> list, T key) {
     136     //ArrayList implement RandomAccess,而LinkedList没有实现 RandomAccess,list.size()>5000时使用普通二次搜索查找法消耗的性能过大
     137         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
     138         
     139             return Collections.indexedBinarySearch(list, key);
     140         else
     141             return Collections.iteratorBinarySearch(list, key);
     142     }
     143 
     144     private static <T>
     145     int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
     146         int low = 0;
     147         int high = list.size()-1;
     148 
     149         while (low <= high) {
     150             int mid = (low + high) >>> 1;
     151             Comparable<? super T> midVal = list.get(mid);
     152             int cmp = midVal.compareTo(key);
     153 
     154             if (cmp < 0)
     155                 low = mid + 1;
     156             else if (cmp > 0)
     157                 high = mid - 1;
     158             else
     159                 return mid; // key found
     160         }
     161         return -(low + 1);  // key not found
     162     }
     163 
     164     private static <T>
     165     int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
     166     {
     167         int low = 0;
     168         int high = list.size()-1;
     169         ListIterator<? extends Comparable<? super T>> i = list.listIterator();
     170 
     171         while (low <= high) {
     172             int mid = (low + high) >>> 1;
     173             Comparable<? super T> midVal = get(i, mid);
     174             int cmp = midVal.compareTo(key);
     175 
     176             if (cmp < 0)
     177                 low = mid + 1;
     178             else if (cmp > 0)
     179                 high = mid - 1;
     180             else
     181                 return mid; // key found
     182         }
     183         return -(low + 1);  // key not found
     184     }
     185 
     186     /**
     187      * Gets the ith element from the given list by repositioning the specified
     188      * list listIterator.
     189      */
     190     private static <T> T get(ListIterator<? extends T> i, int index) {
     191         T obj = null;
     192         int pos = i.nextIndex();
     193         if (pos <= index) {
     194             do {
     195                 obj = i.next();
     196             } while (pos++ < index);
     197         } else {
     198             do {
     199                 obj = i.previous();
     200             } while (--pos > index);
     201         }
     202         return obj;
     203     }
     204 
     205     /**
     206      * Searches the specified list for the specified object using the binary
     207      * search algorithm.  The list must be sorted into ascending order
     208      * according to the specified comparator (as by the
     209      * {@link #sort(List, Comparator) sort(List, Comparator)}
     210      * method), prior to making this call.  If it is
     211      * not sorted, the results are undefined.  If the list contains multiple
     212      * elements equal to the specified object, there is no guarantee which one
     213      * will be found.
     214      *
     215      * <p>This method runs in log(n) time for a "random access" list (which
     216      * provides near-constant-time positional access).  If the specified list
     217      * does not implement the {@link RandomAccess} interface and is large,
     218      * this method will do an iterator-based binary search that performs
     219      * O(n) link traversals and O(log n) element comparisons.
     220      *
     221      * @param  <T> the class of the objects in the list
     222      * @param  list the list to be searched.
     223      * @param  key the key to be searched for.
     224      * @param  c the comparator by which the list is ordered.
     225      *         A <tt>null</tt> value indicates that the elements'
     226      *         {@linkplain Comparable natural ordering} should be used.
     227      * @return the index of the search key, if it is contained in the list;
     228      *         otherwise, <tt>(-(<i>insertion point</i>) - 1)</tt>.  The
     229      *         <i>insertion point</i> is defined as the point at which the
     230      *         key would be inserted into the list: the index of the first
     231      *         element greater than the key, or <tt>list.size()</tt> if all
     232      *         elements in the list are less than the specified key.  Note
     233      *         that this guarantees that the return value will be &gt;= 0 if
     234      *         and only if the key is found.
     235      * @throws ClassCastException if the list contains elements that are not
     236      *         <i>mutually comparable</i> using the specified comparator,
     237      *         or the search key is not mutually comparable with the
     238      *         elements of the list using this comparator.
     239      */
     240     //使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据指定的比较器对列表进行升序排序(通过 sort(List, Comparator) //方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。  
     241     @SuppressWarnings("unchecked")
     242     public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {
     243         if (c==null)
     244             return binarySearch((List<? extends Comparable<? super T>>) list, key);
     245 
     246         if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
     247             return Collections.indexedBinarySearch(list, key, c);
     248         else
     249             return Collections.iteratorBinarySearch(list, key, c);
     250     }
     251 
     252     private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
     253         int low = 0;
     254         int high = l.size()-1;
     255 
     256         while (low <= high) {
     257             int mid = (low + high) >>> 1;
     258             T midVal = l.get(mid);
     259             int cmp = c.compare(midVal, key);
     260 
     261             if (cmp < 0)
     262                 low = mid + 1;
     263             else if (cmp > 0)
     264                 high = mid - 1;
     265             else
     266                 return mid; // key found
     267         }
     268         return -(low + 1);  // key not found
     269     }
     270 
     271     private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
     272         int low = 0;
     273         int high = l.size()-1;
     274         ListIterator<? extends T> i = l.listIterator();
     275 
     276         while (low <= high) {
     277             int mid = (low + high) >>> 1;
     278             T midVal = get(i, mid);
     279             int cmp = c.compare(midVal, key);
     280 
     281             if (cmp < 0)
     282                 low = mid + 1;
     283             else if (cmp > 0)
     284                 high = mid - 1;
     285             else
     286                 return mid; // key found
     287         }
     288         return -(low + 1);  // key not found
     289     }
     290 
     291     /**
     292      * Reverses the order of the elements in the specified list.<p>
     293      *
     294      * This method runs in linear time.
     295      *
     296      * @param  list the list whose elements are to be reversed.
     297      * @throws UnsupportedOperationException if the specified list or
     298      *         its list-iterator does not support the <tt>set</tt> operation.
     299      */
     300     //反转指定列表中元素的顺序。 
     301     @SuppressWarnings({"rawtypes", "unchecked"})
     302     public static void reverse(List<?> list) {
     303         int size = list.size();
     304         if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {
     305             for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)
     306                 swap(list, i, j);
     307         } else {
     308             // instead of using a raw type here, it's possible to capture
     309             // the wildcard but it will require a call to a supplementary
     310             // private method
     311             ListIterator fwd = list.lis tIterator();
     312             ListIterator rev = list.listIterator(size);
     313             for (int i=0, mid=list.size()>>1; i<mid; i++) {
     314                 Object tmp = fwd.next();
     315                 fwd.set(rev.previous());
     316                 rev.set(tmp);
     317             }
     318         }
     319     }
     320 
     321     /**
     322      * Randomly permutes the specified list using a default source of
     323      * randomness.  All permutations occur with approximately equal
     324      * likelihood.
     325      *
     326      * <p>The hedge "approximately" is used in the foregoing description because
     327      * default source of randomness is only approximately an unbiased source
     328      * of independently chosen bits. If it were a perfect source of randomly
     329      * chosen bits, then the algorithm would choose permutations with perfect
     330      * uniformity.
     331      *
     332      * <p>This implementation traverses the list backwards, from the last
     333      * element up to the second, repeatedly swapping a randomly selected element
     334      * into the "current position".  Elements are randomly selected from the
     335      * portion of the list that runs from the first element to the current
     336      * position, inclusive.
     337      *
     338      * <p>This method runs in linear time.  If the specified list does not
     339      * implement the {@link RandomAccess} interface and is large, this
     340      * implementation dumps the specified list into an array before shuffling
     341      * it, and dumps the shuffled array back into the list.  This avoids the
     342      * quadratic behavior that would result from shuffling a "sequential
     343      * access" list in place.
     344      *
     345      * @param  list the list to be shuffled.
     346      * @throws UnsupportedOperationException if the specified list or
     347      *         its list-iterator does not support the <tt>set</tt> operation.
     348      */
     349     //使用默认随机源对指定列表进行置换。所有置换发生的可能性都是大致相等的。
     350     //此实现向后遍历列表,从最后一个元素一直到第二个元素,将随机选择的元素重复交换到“当前位置”。
     351     //元素是从列表的一部分随机选择的,该部分列表从第一个元素一直到当前位置(包括)。
     352     //此方法以线性时间运行。如果指定列表没有实现 RandomAccess 接口并且是一个大型列表,则此实现在改组列表前将指定列表转储到数组中,
     353     //并将改组后的数组转储回列表中。这避免了二次行为,该行为是原地改组一个“有序访问”列表引起的。 
     354     public static void shuffle(List<?> list) {
     355         Random rnd = r;
     356         if (rnd == null)
     357             r = rnd = new Random(); // harmless race.
     358         shuffle(list, rnd);
     359     }
     360 
     361     private static Random r;
     362 
     363     /**
     364      * Randomly permute the specified list using the specified source of
     365      * randomness.  All permutations occur with equal likelihood
     366      * assuming that the source of randomness is fair.<p>
     367      *
     368      * This implementation traverses the list backwards, from the last element
     369      * up to the second, repeatedly swapping a randomly selected element into
     370      * the "current position".  Elements are randomly selected from the
     371      * portion of the list that runs from the first element to the current
     372      * position, inclusive.<p>
     373      *
     374      * This method runs in linear time.  If the specified list does not
     375      * implement the {@link RandomAccess} interface and is large, this
     376      * implementation dumps the specified list into an array before shuffling
     377      * it, and dumps the shuffled array back into the list.  This avoids the
     378      * quadratic behavior that would result from shuffling a "sequential
     379      * access" list in place.
     380      *
     381      * @param  list the list to be shuffled.
     382      * @param  rnd the source of randomness to use to shuffle the list.
     383      * @throws UnsupportedOperationException if the specified list or its
     384      *         list-iterator does not support the <tt>set</tt> operation.
     385      */
     386     //使用指定的随机源对指定列表进行置换。所有置换发生的可能性都是相等的,假定随机源是公平的。 
     387     //同方法:shuffle(List<?> list)
     388     @SuppressWarnings({"rawtypes", "unchecked"})
     389     public static void shuffle(List<?> list, Random rnd) {
     390         int size = list.size();
     391         if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
     392             for (int i=size; i>1; i--)
     393                 swap(list, i-1, rnd.nextInt(i));
     394         } else {
     395             Object arr[] = list.toArray();
     396 
     397             // Shuffle array
     398             for (int i=size; i>1; i--)
     399                 swap(arr, i-1, rnd.nextInt(i));
     400 
     401             // Dump array back into list
     402             // instead of using a raw type here, it's possible to capture
     403             // the wildcard but it will require a call to a supplementary
     404             // private method
     405             ListIterator it = list.listIterator();
     406             for (int i=0; i<arr.length; i++) {
     407                 it.next();
     408                 it.set(arr[i]);
     409             }
     410         }
     411     }
     412 
     413     /**
     414      * Swaps the elements at the specified positions in the specified list.
     415      * (If the specified positions are equal, invoking this method leaves
     416      * the list unchanged.)
     417      *
     418      * @param list The list in which to swap elements.
     419      * @param i the index of one element to be swapped.
     420      * @param j the index of the other element to be swapped.
     421      * @throws IndexOutOfBoundsException if either <tt>i</tt> or <tt>j</tt>
     422      *         is out of range (i &lt; 0 || i &gt;= list.size()
     423      *         || j &lt; 0 || j &gt;= list.size()).
     424      * @since 1.4
     425      */
     426     //在指定列表的指定位置处交换元素 
     427     @SuppressWarnings({"rawtypes", "unchecked"})
     428     public static void swap(List<?> list, int i, int j) {
     429         // instead of using a raw type here, it's possible to capture
     430         // the wildcard but it will require a call to a supplementary
     431         // private method
     432         final List l = list;
     433         l.set(i, l.set(j, l.get(i)));
     434     }
     435 
     436     /**
     437      * Swaps the two specified elements in the specified array.
     438      */
     439     private static void swap(Object[] arr, int i, int j) {
     440         Object tmp = arr[i];
     441         arr[i] = arr[j];
     442         arr[j] = tmp;
     443     }
     444 
     445     /**
     446      * Replaces all of the elements of the specified list with the specified
     447      * element. <p>
     448      *
     449      * This method runs in linear time.
     450      *
     451      * @param  <T> the class of the objects in the list
     452      * @param  list the list to be filled with the specified element.
     453      * @param  obj The element with which to fill the specified list.
     454      * @throws UnsupportedOperationException if the specified list or its
     455      *         list-iterator does not support the <tt>set</tt> operation.
     456      */
     457     //使用指定元素替换指定列表中的所有元素。 
     458     public static <T> void fill(List<? super T> list, T obj) {
     459         int size = list.size();
     460 
     461         if (size < FILL_THRESHOLD || list instanceof RandomAccess) {
     462             for (int i=0; i<size; i++)
     463                 list.set(i, obj);
     464         } else {
     465             ListIterator<? super T> itr = list.listIterator();
     466             for (int i=0; i<size; i++) {
     467                 itr.next();
     468                 itr.set(obj);
     469             }
     470         }
     471     }
     472 
     473     /**
     474      * Copies all of the elements from one list into another.  After the
     475      * operation, the index of each copied element in the destination list
     476      * will be identical to its index in the source list.  The destination
     477      * list must be at least as long as the source list.  If it is longer, the
     478      * remaining elements in the destination list are unaffected. <p>
     479      *
     480      * This method runs in linear time.
     481      *
     482      * @param  <T> the class of the objects in the lists
     483      * @param  dest The destination list.
     484      * @param  src The source list.
     485      * @throws IndexOutOfBoundsException if the destination list is too small
     486      *         to contain the entire source List.
     487      * @throws UnsupportedOperationException if the destination list's
     488      *         list-iterator does not support the <tt>set</tt> operation.
     489      */
     490     //将所有元素从一个列表复制到另一个列表 
     491     //目标列表的长度至少必须等于源列表。 
     492     public static <T> void copy(List<? super T> dest, List<? extends T> src) {
     493         int srcSize = src.size();
     494         if (srcSize > dest.size())
     495             throw new IndexOutOfBoundsException("Source does not fit in dest");
     496 
     497         if (srcSize < COPY_THRESHOLD ||
     498             (src instanceof RandomAccess && dest instanceof RandomAccess)) {
     499             for (int i=0; i<srcSize; i++)
     500                 dest.set(i, src.get(i));
     501         } else {
     502             ListIterator<? super T> di=dest.listIterator();
     503             ListIterator<? extends T> si=src.listIterator();
     504             for (int i=0; i<srcSize; i++) {
     505                 di.next();
     506                 di.set(si.next());
     507             }
     508         }
     509     }
     510 
     511     /**
     512      * Returns the minimum element of the given collection, according to the
     513      * <i>natural ordering</i> of its elements.  All elements in the
     514      * collection must implement the <tt>Comparable</tt> interface.
     515      * Furthermore, all elements in the collection must be <i>mutually
     516      * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
     517      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
     518      * <tt>e2</tt> in the collection).<p>
     519      *
     520      * This method iterates over the entire collection, hence it requires
     521      * time proportional to the size of the collection.
     522      *
     523      * @param  <T> the class of the objects in the collection
     524      * @param  coll the collection whose minimum element is to be determined.
     525      * @return the minimum element of the given collection, according
     526      *         to the <i>natural ordering</i> of its elements.
     527      * @throws ClassCastException if the collection contains elements that are
     528      *         not <i>mutually comparable</i> (for example, strings and
     529      *         integers).
     530      * @throws NoSuchElementException if the collection is empty.
     531      * @see Comparable
     532      */
     533     //根据元素的自然顺序 返回给定 collection 的最小元素。collection 中的所有元素都必须实现 Comparable 接口。 
     534     public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) {
     535         Iterator<? extends T> i = coll.iterator();
     536         T candidate = i.next();
     537 
     538         while (i.hasNext()) {
     539             T next = i.next();
     540             if (next.compareTo(candidate) < 0)
     541                 candidate = next;
     542         }
     543         return candidate;
     544     }
     545 
     546     /**
     547      * Returns the minimum element of the given collection, according to the
     548      * order induced by the specified comparator.  All elements in the
     549      * collection must be <i>mutually comparable</i> by the specified
     550      * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
     551      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
     552      * <tt>e2</tt> in the collection).<p>
     553      *
     554      * This method iterates over the entire collection, hence it requires
     555      * time proportional to the size of the collection.
     556      *
     557      * @param  <T> the class of the objects in the collection
     558      * @param  coll the collection whose minimum element is to be determined.
     559      * @param  comp the comparator with which to determine the minimum element.
     560      *         A <tt>null</tt> value indicates that the elements' <i>natural
     561      *         ordering</i> should be used.
     562      * @return the minimum element of the given collection, according
     563      *         to the specified comparator.
     564      * @throws ClassCastException if the collection contains elements that are
     565      *         not <i>mutually comparable</i> using the specified comparator.
     566      * @throws NoSuchElementException if the collection is empty.
     567      * @see Comparable
     568      */
     569     //根据指定比较器产生的顺序,返回给定 collection 的最小元素。同min
     570     @SuppressWarnings({"unchecked", "rawtypes"})
     571     public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) {
     572         if (comp==null)
     573             return (T)min((Collection) coll);
     574 
     575         Iterator<? extends T> i = coll.iterator();
     576         T candidate = i.next();
     577 
     578         while (i.hasNext()) {
     579             T next = i.next();
     580             if (comp.compare(next, candidate) < 0)
     581                 candidate = next;
     582         }
     583         return candidate;
     584     }
     585 
     586     /**
     587      * Returns the maximum element of the given collection, according to the
     588      * <i>natural ordering</i> of its elements.  All elements in the
     589      * collection must implement the <tt>Comparable</tt> interface.
     590      * Furthermore, all elements in the collection must be <i>mutually
     591      * comparable</i> (that is, <tt>e1.compareTo(e2)</tt> must not throw a
     592      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
     593      * <tt>e2</tt> in the collection).<p>
     594      *
     595      * This method iterates over the entire collection, hence it requires
     596      * time proportional to the size of the collection.
     597      *
     598      * @param  <T> the class of the objects in the collection
     599      * @param  coll the collection whose maximum element is to be determined.
     600      * @return the maximum element of the given collection, according
     601      *         to the <i>natural ordering</i> of its elements.
     602      * @throws ClassCastException if the collection contains elements that are
     603      *         not <i>mutually comparable</i> (for example, strings and
     604      *         integers).
     605      * @throws NoSuchElementException if the collection is empty.
     606      * @see Comparable
     607      */
     608     //根据元素的自然顺序,返回给定 collection 的最大元素。同min
     609     public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
     610         Iterator<? extends T> i = coll.iterator();
     611         T candidate = i.next();
     612 
     613         while (i.hasNext()) {
     614             T next = i.next();
     615             if (next.compareTo(candidate) > 0)
     616                 candidate = next;
     617         }
     618         return candidate;
     619     }
     620 
     621     /**
     622      * Returns the maximum element of the given collection, according to the
     623      * order induced by the specified comparator.  All elements in the
     624      * collection must be <i>mutually comparable</i> by the specified
     625      * comparator (that is, <tt>comp.compare(e1, e2)</tt> must not throw a
     626      * <tt>ClassCastException</tt> for any elements <tt>e1</tt> and
     627      * <tt>e2</tt> in the collection).<p>
     628      *
     629      * This method iterates over the entire collection, hence it requires
     630      * time proportional to the size of the collection.
     631      *
     632      * @param  <T> the class of the objects in the collection
     633      * @param  coll the collection whose maximum element is to be determined.
     634      * @param  comp the comparator with which to determine the maximum element.
     635      *         A <tt>null</tt> value indicates that the elements' <i>natural
     636      *        ordering</i> should be used.
     637      * @return the maximum element of the given collection, according
     638      *         to the specified comparator.
     639      * @throws ClassCastException if the collection contains elements that are
     640      *         not <i>mutually comparable</i> using the specified comparator.
     641      * @throws NoSuchElementException if the collection is empty.
     642      * @see Comparable
     643      */
     644     //根据指定比较器产生的顺序,返回给定 collection 的最大元素。同min 
     645     @SuppressWarnings({"unchecked", "rawtypes"})
     646     public static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp) {
     647         if (comp==null)
     648             return (T)max((Collection) coll);
     649 
     650         Iterator<? extends T> i = coll.iterator();
     651         T candidate = i.next();
     652 
     653         while (i.hasNext()) {
     654             T next = i.next();
     655             if (comp.compare(next, candidate) > 0)
     656                 candidate = next;
     657         }
     658         return candidate;
     659     }
     660 
     661     /**
     662      * Rotates the elements in the specified list by the specified distance.
     663      * After calling this method, the element at index <tt>i</tt> will be
     664      * the element previously at index <tt>(i - distance)</tt> mod
     665      * <tt>list.size()</tt>, for all values of <tt>i</tt> between <tt>0</tt>
     666      * and <tt>list.size()-1</tt>, inclusive.  (This method has no effect on
     667      * the size of the list.)
     668      *
     669      * <p>For example, suppose <tt>list</tt> comprises<tt> [t, a, n, k, s]</tt>.
     670      * After invoking <tt>Collections.rotate(list, 1)</tt> (or
     671      * <tt>Collections.rotate(list, -4)</tt>), <tt>list</tt> will comprise
     672      * <tt>[s, t, a, n, k]</tt>.
     673      *
     674      * <p>Note that this method can usefully be applied to sublists to
     675      * move one or more elements within a list while preserving the
     676      * order of the remaining elements.  For example, the following idiom
     677      * moves the element at index <tt>j</tt> forward to position
     678      * <tt>k</tt> (which must be greater than or equal to <tt>j</tt>):
     679      * <pre>
     680      *     Collections.rotate(list.subList(j, k+1), -1);
     681      * </pre>
     682      * To make this concrete, suppose <tt>list</tt> comprises
     683      * <tt>[a, b, c, d, e]</tt>.  To move the element at index <tt>1</tt>
     684      * (<tt>b</tt>) forward two positions, perform the following invocation:
     685      * <pre>
     686      *     Collections.rotate(l.subList(1, 4), -1);
     687      * </pre>
     688      * The resulting list is <tt>[a, c, d, b, e]</tt>.
     689      *
     690      * <p>To move more than one element forward, increase the absolute value
     691      * of the rotation distance.  To move elements backward, use a positive
     692      * shift distance.
     693      *
     694      * <p>If the specified list is small or implements the {@link
     695      * RandomAccess} interface, this implementation exchanges the first
     696      * element into the location it should go, and then repeatedly exchanges
     697      * the displaced element into the location it should go until a displaced
     698      * element is swapped into the first element.  If necessary, the process
     699      * is repeated on the second and successive elements, until the rotation
     700      * is complete.  If the specified list is large and doesn't implement the
     701      * <tt>RandomAccess</tt> interface, this implementation breaks the
     702      * list into two sublist views around index <tt>-distance mod size</tt>.
     703      * Then the {@link #reverse(List)} method is invoked on each sublist view,
     704      * and finally it is invoked on the entire list.  For a more complete
     705      * description of both algorithms, see Section 2.3 of Jon Bentley's
     706      * <i>Programming Pearls</i> (Addison-Wesley, 1986).
     707      *
     708      * @param list the list to be rotated.
     709      * @param distance the distance to rotate the list.  There are no
     710      *        constraints on this value; it may be zero, negative, or
     711      *        greater than <tt>list.size()</tt>.
     712      * @throws UnsupportedOperationException if the specified list or
     713      *         its list-iterator does not support the <tt>set</tt> operation.
     714      * @since 1.4
     715      */
     716     //根据指定的距离轮换指定列表中的元素。 
     717     public static void rotate(List<?> list, int distance) {
     718         if (list instanceof RandomAccess || list.size() < ROTATE_THRESHOLD)
     719             rotate1(list, distance);
     720         else
     721             rotate2(list, distance);
     722     }
     723 
     724     示例:会改变list的数据结构
     725     public static void main(String[] args) {
     726         List<Integer> list = new ArrayList<Integer>();
     727         list.add(0);
     728         list.add(1);
     729         list.add(2);
     730         list.add(3);
     731         list.add(4);
     732         list.add(5);
     733         System.out.println(list);
     734         List<Integer> integers = list.subList(1, 4);
     735         System.out.println(integers);
     736         Collections.rotate(integers,1);
     737         System.out.println(list);
     738     }
     739     
     740     结果:
     741     [0, 1, 2, 3, 4, 5]
     742     [1, 2, 3]
     743     [0, 3, 1, 2, 4, 5]
     744         
     745     private static <T> void rotate1(List<T> list, int distance) {
     746         int size = list.size();
     747         if (size == 0)
     748             return;
     749         distance = distance % size;
     750         if (distance < 0)
     751             distance += size;
     752         if (distance == 0)
     753             return;
     754 
     755         for (int cycleStart = 0, nMoved = 0; nMoved != size; cycleStart++) {
     756             T displaced = list.get(cycleStart);
     757             int i = cycleStart;
     758             do {
     759                 i += distance;
     760                 if (i >= size)
     761                     i -= size;
     762                 displaced = list.set(i, displaced);
     763                 nMoved ++;
     764             } while (i != cycleStart);
     765         }
     766     }
     767 
     768     private static void rotate2(List<?> list, int distance) {
     769         int size = list.size();
     770         if (size == 0)
     771             return;
     772         int mid =  -distance % size;
     773         if (mid < 0)
     774             mid += size;
     775         if (mid == 0)
     776             return;
     777 
     778         reverse(list.subList(0, mid));
     779         reverse(list.subList(mid, size));
     780         reverse(list);
     781     }
     782 
     783     /**
     784      * Replaces all occurrences of one specified value in a list with another.
     785      * More formally, replaces with <tt>newVal</tt> each element <tt>e</tt>
     786      * in <tt>list</tt> such that
     787      * <tt>(oldVal==null ? e==null : oldVal.equals(e))</tt>.
     788      * (This method has no effect on the size of the list.)
     789      *
     790      * @param  <T> the class of the objects in the list
     791      * @param list the list in which replacement is to occur.
     792      * @param oldVal the old value to be replaced.
     793      * @param newVal the new value with which <tt>oldVal</tt> is to be
     794      *        replaced.
     795      * @return <tt>true</tt> if <tt>list</tt> contained one or more elements
     796      *         <tt>e</tt> such that
     797      *         <tt>(oldVal==null ?  e==null : oldVal.equals(e))</tt>.
     798      * @throws UnsupportedOperationException if the specified list or
     799      *         its list-iterator does not support the <tt>set</tt> operation.
     800      * @since  1.4
     801      */
     802     //使用另一个值替换列表中出现的所有某一指定值。
     803     //更确切地讲,使用 newVal 替换 list 中满足 (oldVal==null ? e==null : oldVal.equals(e)) 的每个 e 元素。
     804     public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal) {
     805         boolean result = false;
     806         int size = list.size();
     807         if (size < REPLACEALL_THRESHOLD || list instanceof RandomAccess) {
     808             if (oldVal==null) {
     809                 for (int i=0; i<size; i++) {
     810                     if (list.get(i)==null) {
     811                         list.set(i, newVal);
     812                         result = true;
     813                     }
     814                 }
     815             } else {
     816                 for (int i=0; i<size; i++) {
     817                     if (oldVal.equals(list.get(i))) {
     818                         list.set(i, newVal);
     819                         result = true;
     820                     }
     821                 }
     822             }
     823         } else {
     824             ListIterator<T> itr=list.listIterator();
     825             if (oldVal==null) {
     826                 for (int i=0; i<size; i++) {
     827                     if (itr.next()==null) {
     828                         itr.set(newVal);
     829                         result = true;
     830                     }
     831                 }
     832             } else {
     833                 for (int i=0; i<size; i++) {
     834                     if (oldVal.equals(itr.next())) {
     835                         itr.set(newVal);
     836                         result = true;
     837                     }
     838                 }
     839             }
     840         }
     841         return result;
     842     }
     843 
     844     /**
     845      * Returns the starting position of the first occurrence of the specified
     846      * target list within the specified source list, or -1 if there is no
     847      * such occurrence.  More formally, returns the lowest index <tt>i</tt>
     848      * such that {@code source.subList(i, i+target.size()).equals(target)},
     849      * or -1 if there is no such index.  (Returns -1 if
     850      * {@code target.size() > source.size()})
     851      *
     852      * <p>This implementation uses the "brute force" technique of scanning
     853      * over the source list, looking for a match with the target at each
     854      * location in turn.
     855      *
     856      * @param source the list in which to search for the first occurrence
     857      *        of <tt>target</tt>.
     858      * @param target the list to search for as a subList of <tt>source</tt>.
     859      * @return the starting position of the first occurrence of the specified
     860      *         target list within the specified source list, or -1 if there
     861      *         is no such occurrence.
     862      * @since  1.4
     863      */
     864     //返回指定源列表中第一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。
     865     public static int indexOfSubList(List<?> source, List<?> target) {
     866         int sourceSize = source.size();
     867         int targetSize = target.size();
     868         int maxCandidate = sourceSize - targetSize;
     869 
     870         if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
     871             (source instanceof RandomAccess&&target instanceof RandomAccess)) {
     872         nextCand:
     873             for (int candidate = 0; candidate <= maxCandidate; candidate++) {
     874                 for (int i=0, j=candidate; i<targetSize; i++, j++)
     875                     if (!eq(target.get(i), source.get(j)))
     876                         continue nextCand;  // Element mismatch, try next cand
     877                 return candidate;  // All elements of candidate matched target
     878             }
     879         } else {  // Iterator version of above algorithm
     880             ListIterator<?> si = source.listIterator();
     881         nextCand:
     882             for (int candidate = 0; candidate <= maxCandidate; candidate++) {
     883                 ListIterator<?> ti = target.listIterator();
     884                 for (int i=0; i<targetSize; i++) {
     885                     if (!eq(ti.next(), si.next())) {
     886                         // Back up source iterator to next candidate
     887                         for (int j=0; j<i; j++)
     888                             si.previous();
     889                         continue nextCand;
     890                     }
     891                 }
     892                 return candidate;
     893             }
     894         }
     895         return -1;  // No candidate matched the target
     896     }
     897 
     898     /**
     899      * Returns the starting position of the last occurrence of the specified
     900      * target list within the specified source list, or -1 if there is no such
     901      * occurrence.  More formally, returns the highest index <tt>i</tt>
     902      * such that {@code source.subList(i, i+target.size()).equals(target)},
     903      * or -1 if there is no such index.  (Returns -1 if
     904      * {@code target.size() > source.size()})
     905      *
     906      * <p>This implementation uses the "brute force" technique of iterating
     907      * over the source list, looking for a match with the target at each
     908      * location in turn.
     909      *
     910      * @param source the list in which to search for the last occurrence
     911      *        of <tt>target</tt>.
     912      * @param target the list to search for as a subList of <tt>source</tt>.
     913      * @return the starting position of the last occurrence of the specified
     914      *         target list within the specified source list, or -1 if there
     915      *         is no such occurrence.
     916      * @since  1.4
     917      */
     918     //返回指定源列表中最后一次出现指定目标列表的起始位置;如果没有出现这样的列表,则返回 -1。 
     919     public static int lastIndexOfSubList(List<?> source, List<?> target) {
     920         int sourceSize = source.size();
     921         int targetSize = target.size();
     922         int maxCandidate = sourceSize - targetSize;
     923 
     924         if (sourceSize < INDEXOFSUBLIST_THRESHOLD ||
     925             source instanceof RandomAccess) {   // Index access version
     926         nextCand:
     927             for (int candidate = maxCandidate; candidate >= 0; candidate--) {
     928                 for (int i=0, j=candidate; i<targetSize; i++, j++)
     929                     if (!eq(target.get(i), source.get(j)))
     930                         continue nextCand;  // Element mismatch, try next cand
     931                 return candidate;  // All elements of candidate matched target
     932             }
     933         } else {  // Iterator version of above algorithm
     934             if (maxCandidate < 0)
     935                 return -1;
     936             ListIterator<?> si = source.listIterator(maxCandidate);
     937         nextCand:
     938             for (int candidate = maxCandidate; candidate >= 0; candidate--) {
     939                 ListIterator<?> ti = target.listIterator();
     940                 for (int i=0; i<targetSize; i++) {
     941                     if (!eq(ti.next(), si.next())) {
     942                         if (candidate != 0) {
     943                             // Back up source iterator to next candidate
     944                             for (int j=0; j<=i+1; j++)
     945                                 si.previous();
     946                         }
     947                         continue nextCand;
     948                     }
     949                 }
     950                 return candidate;
     951             }
     952         }
     953         return -1;  // No candidate matched the target
     954     }
     955 
     956 
     957     // Unmodifiable Wrappers
     958 
     959     /**
     960      * Returns an unmodifiable view of the specified collection.  This method
     961      * allows modules to provide users with "read-only" access to internal
     962      * collections.  Query operations on the returned collection "read through"
     963      * to the specified collection, and attempts to modify the returned
     964      * collection, whether direct or via its iterator, result in an
     965      * <tt>UnsupportedOperationException</tt>.<p>
     966      *
     967      * The returned collection does <i>not</i> pass the hashCode and equals
     968      * operations through to the backing collection, but relies on
     969      * <tt>Object</tt>'s <tt>equals</tt> and <tt>hashCode</tt> methods.  This
     970      * is necessary to preserve the contracts of these operations in the case
     971      * that the backing collection is a set or a list.<p>
     972      *
     973      * The returned collection will be serializable if the specified collection
     974      * is serializable.
     975      *
     976      * @param  <T> the class of the objects in the collection
     977      * @param  c the collection for which an unmodifiable view is to be
     978      *         returned.
     979      * @return an unmodifiable view of the specified collection.
     980      */
     981     //返回指定 collection 的不可修改视图。此方法允许模块为用户提供对内部 collection 的“只读”访问。
     982     //在返回的 collection 上执行的查询操作将“读完”指定的 collection。 
     983     //人为的给普通容器加上不可修改的特性 
     984     public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
     985         return new UnmodifiableCollection<>(c);
     986     }
     987 
     988     /**
     989      * @serial include
     990      */
     991     static class UnmodifiableCollection<E> implements Collection<E>, Serializable {
     992         private static final long serialVersionUID = 1820017752578914078L;
     993 
     994         final Collection<? extends E> c;
     995 
     996         UnmodifiableCollection(Collection<? extends E> c) {
     997             if (c==null)
     998                 throw new NullPointerException();
     999             this.c = c;
    1000         }
    1001 
    1002         public int size()                   {return c.size();}
    1003         public boolean isEmpty()            {return c.isEmpty();}
    1004         public boolean contains(Object o)   {return c.contains(o);}
    1005         public Object[] toArray()           {return c.toArray();}
    1006         public <T> T[] toArray(T[] a)       {return c.toArray(a);}
    1007         public String toString()            {return c.toString();}
    1008 
    1009         public Iterator<E> iterator() {
    1010             return new Iterator<E>() {
    1011                 private final Iterator<? extends E> i = c.iterator();
    1012 
    1013                 public boolean hasNext() {return i.hasNext();}
    1014                 public E next()          {return i.next();}
    1015                 public void remove() {
    1016                     throw new UnsupportedOperationException();
    1017                 }
    1018                 @Override
    1019                 public void forEachRemaining(Consumer<? super E> action) {
    1020                     // Use backing collection version
    1021                     i.forEachRemaining(action);
    1022                 }
    1023             };
    1024         }
    1025 
    1026         public boolean add(E e) {
    1027             throw new UnsupportedOperationException();
    1028         }
    1029         public boolean remove(Object o) {
    1030             throw new UnsupportedOperationException();
    1031         }
    1032 
    1033         public boolean containsAll(Collection<?> coll) {
    1034             return c.containsAll(coll);
    1035         }
    1036         public boolean addAll(Collection<? extends E> coll) {
    1037             throw new UnsupportedOperationException();
    1038         }
    1039         public boolean removeAll(Collection<?> coll) {
    1040             throw new UnsupportedOperationException();
    1041         }
    1042         public boolean retainAll(Collection<?> coll) {
    1043             throw new UnsupportedOperationException();
    1044         }
    1045         public void clear() {
    1046             throw new UnsupportedOperationException();
    1047         }
    1048 
    1049         // Override default methods in Collection
    1050         @Override
    1051         public void forEach(Consumer<? super E> action) {
    1052             c.forEach(action);
    1053         }
    1054         @Override
    1055         public boolean removeIf(Predicate<? super E> filter) {
    1056             throw new UnsupportedOperationException();
    1057         }
    1058         @SuppressWarnings("unchecked")
    1059         @Override
    1060         public Spliterator<E> spliterator() {
    1061             return (Spliterator<E>)c.spliterator();
    1062         }
    1063         @SuppressWarnings("unchecked")
    1064         @Override
    1065         public Stream<E> stream() {
    1066             return (Stream<E>)c.stream();
    1067         }
    1068         @SuppressWarnings("unchecked")
    1069         @Override
    1070         public Stream<E> parallelStream() {
    1071             return (Stream<E>)c.parallelStream();
    1072         }
    1073     }
    1074 
    1075     /**
    1076      * Returns an unmodifiable view of the specified set.  This method allows
    1077      * modules to provide users with "read-only" access to internal sets.
    1078      * Query operations on the returned set "read through" to the specified
    1079      * set, and attempts to modify the returned set, whether direct or via its
    1080      * iterator, result in an <tt>UnsupportedOperationException</tt>.<p>
    1081      *
    1082      * The returned set will be serializable if the specified set
    1083      * is serializable.
    1084      *
    1085      * @param  <T> the class of the objects in the set
    1086      * @param  s the set for which an unmodifiable view is to be returned.
    1087      * @return an unmodifiable view of the specified set.
    1088      */
    1089     //返回指定 set 的不可修改视图。此方法允许模块为用户提供对内部 set 的“只读”访问。
    1090     //在返回的 set 上执行的查询操作将“读完”指定的 set。 
    1091     public static <T> Set<T> unmodifiableSet(Set<? extends T> s) {
    1092         return new UnmodifiableSet<>(s);
    1093     }
    1094 
    1095     /**
    1096      * @serial include
    1097      */
    1098     static class UnmodifiableSet<E> extends UnmodifiableCollection<E>
    1099                                  implements Set<E>, Serializable {
    1100         private static final long serialVersionUID = -9215047833775013803L;
    1101 
    1102         UnmodifiableSet(Set<? extends E> s)     {super(s);}
    1103         public boolean equals(Object o) {return o == this || c.equals(o);}
    1104         public int hashCode()           {return c.hashCode();}
    1105     }
    1106 
    1107     /**
    1108      * Returns an unmodifiable view of the specified sorted set.  This method
    1109      * allows modules to provide users with "read-only" access to internal
    1110      * sorted sets.  Query operations on the returned sorted set "read
    1111      * through" to the specified sorted set.  Attempts to modify the returned
    1112      * sorted set, whether direct, via its iterator, or via its
    1113      * <tt>subSet</tt>, <tt>headSet</tt>, or <tt>tailSet</tt> views, result in
    1114      * an <tt>UnsupportedOperationException</tt>.<p>
    1115      *
    1116      * The returned sorted set will be serializable if the specified sorted set
    1117      * is serializable.
    1118      *
    1119      * @param  <T> the class of the objects in the set
    1120      * @param s the sorted set for which an unmodifiable view is to be
    1121      *        returned.
    1122      * @return an unmodifiable view of the specified sorted set.
    1123      */
    1124     //返回指定有序 set 的不可修改视图。此方法允许模块为用户提供对内部有序 set 的“只读”访问。
    1125     //在返回的有序 set 上执行的查询操作将“读完”指定的有序 set。 
    1126     public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s) {
    1127         return new UnmodifiableSortedSet<>(s);
    1128     }
    1129 
    1130     /**
    1131      * @serial include
    1132      */
    1133     static class UnmodifiableSortedSet<E>
    1134                              extends UnmodifiableSet<E>
    1135                              implements SortedSet<E>, Serializable {
    1136         private static final long serialVersionUID = -4929149591599911165L;
    1137         private final SortedSet<E> ss;
    1138 
    1139         UnmodifiableSortedSet(SortedSet<E> s) {super(s); ss = s;}
    1140 
    1141         public Comparator<? super E> comparator() {return ss.comparator();}
    1142 
    1143         public SortedSet<E> subSet(E fromElement, E toElement) {
    1144             return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement));
    1145         }
    1146         public SortedSet<E> headSet(E toElement) {
    1147             return new UnmodifiableSortedSet<>(ss.headSet(toElement));
    1148         }
    1149         public SortedSet<E> tailSet(E fromElement) {
    1150             return new UnmodifiableSortedSet<>(ss.tailSet(fromElement));
    1151         }
    1152 
    1153         public E first()                   {return ss.first();}
    1154         public E last()                    {return ss.last();}
    1155     }
    1156 
    1157 
    1158     
    1159   
    1160 
    1161 
    1162     // Synch Wrappers
    1163 
    1164     /**
    1165      * Returns a synchronized (thread-safe) collection backed by the specified
    1166      * collection.  In order to guarantee serial access, it is critical that
    1167      * <strong>all</strong> access to the backing collection is accomplished
    1168      * through the returned collection.<p>
    1169      *
    1170      * It is imperative that the user manually synchronize on the returned
    1171      * collection when traversing it via {@link Iterator}, {@link Spliterator}
    1172      * or {@link Stream}:
    1173      * <pre>
    1174      *  Collection c = Collections.synchronizedCollection(myCollection);
    1175      *     ...
    1176      *  synchronized (c) {
    1177      *      Iterator i = c.iterator(); // Must be in the synchronized block
    1178      *      while (i.hasNext())
    1179      *         foo(i.next());
    1180      *  }
    1181      * </pre>
    1182      * Failure to follow this advice may result in non-deterministic behavior.
    1183      *
    1184      * <p>The returned collection does <i>not</i> pass the {@code hashCode}
    1185      * and {@code equals} operations through to the backing collection, but
    1186      * relies on {@code Object}'s equals and hashCode methods.  This is
    1187      * necessary to preserve the contracts of these operations in the case
    1188      * that the backing collection is a set or a list.<p>
    1189      *
    1190      * The returned collection will be serializable if the specified collection
    1191      * is serializable.
    1192      *
    1193      * @param  <T> the class of the objects in the collection
    1194      * @param  c the collection to be "wrapped" in a synchronized collection.
    1195      * @return a synchronized view of the specified collection.
    1196      */
    1197     //返回指定 collection 支持的同步(线程安全的)collection。
    1198     //为了保证按顺序访问,必须通过返回的 collection 完成所有对底层实现 collection 的访问。
    1199     public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
    1200         return new SynchronizedCollection<>(c);
    1201     }
    1202 
    1203     static <T> Collection<T> synchronizedCollection(Collection<T> c, Object mutex) {
    1204         return new SynchronizedCollection<>(c, mutex);
    1205     }
    1206 
    1207     /**
    1208      * @serial include
    1209      */
    1210     static class SynchronizedCollection<E> implements Collection<E>, Serializable {
    1211         private static final long serialVersionUID = 3053995032091335093L;
    1212 
    1213         final Collection<E> c;  // Backing Collection
    1214         final Object mutex;     // Object on which to synchronize
    1215 
    1216         SynchronizedCollection(Collection<E> c) {
    1217             this.c = Objects.requireNonNull(c);
    1218             mutex = this;
    1219         }
    1220 
    1221         SynchronizedCollection(Collection<E> c, Object mutex) {
    1222             this.c = Objects.requireNonNull(c);
    1223             this.mutex = Objects.requireNonNull(mutex);
    1224         }
    1225 
    1226         public int size() {
    1227             synchronized (mutex) {return c.size();}
    1228         }
    1229         public boolean isEmpty() {
    1230             synchronized (mutex) {return c.isEmpty();}
    1231         }
    1232         public boolean contains(Object o) {
    1233             synchronized (mutex) {return c.contains(o);}
    1234         }
    1235         public Object[] toArray() {
    1236             synchronized (mutex) {return c.toArray();}
    1237         }
    1238         public <T> T[] toArray(T[] a) {
    1239             synchronized (mutex) {return c.toArray(a);}
    1240         }
    1241 
    1242         public Iterator<E> iterator() {
    1243             return c.iterator(); // Must be manually synched by user!
    1244         }
    1245 
    1246         public boolean add(E e) {
    1247             synchronized (mutex) {return c.add(e);}
    1248         }
    1249         public boolean remove(Object o) {
    1250             synchronized (mutex) {return c.remove(o);}
    1251         }
    1252 
    1253         public boolean containsAll(Collection<?> coll) {
    1254             synchronized (mutex) {return c.containsAll(coll);}
    1255         }
    1256         public boolean addAll(Collection<? extends E> coll) {
    1257             synchronized (mutex) {return c.addAll(coll);}
    1258         }
    1259         public boolean removeAll(Collection<?> coll) {
    1260             synchronized (mutex) {return c.removeAll(coll);}
    1261         }
    1262         public boolean retainAll(Collection<?> coll) {
    1263             synchronized (mutex) {return c.retainAll(coll);}
    1264         }
    1265         public void clear() {
    1266             synchronized (mutex) {c.clear();}
    1267         }
    1268         public String toString() {
    1269             synchronized (mutex) {return c.toString();}
    1270         }
    1271         // Override default methods in Collection
    1272         @Override
    1273         public void forEach(Consumer<? super E> consumer) {
    1274             synchronized (mutex) {c.forEach(consumer);}
    1275         }
    1276         @Override
    1277         public boolean removeIf(Predicate<? super E> filter) {
    1278             synchronized (mutex) {return c.removeIf(filter);}
    1279         }
    1280         @Override
    1281         public Spliterator<E> spliterator() {
    1282             return c.spliterator(); // Must be manually synched by user!
    1283         }
    1284         @Override
    1285         public Stream<E> stream() {
    1286             return c.stream(); // Must be manually synched by user!
    1287         }
    1288         @Override
    1289         public Stream<E> parallelStream() {
    1290             return c.parallelStream(); // Must be manually synched by user!
    1291         }
    1292         private void writeObject(ObjectOutputStream s) throws IOException {
    1293             synchronized (mutex) {s.defaultWriteObject();}
    1294         }
    1295     }
    1296 
    1297 
    1298     // Dynamically typesafe collection wrappers
    1299 
    1300     /**
    1301      * Returns a dynamically typesafe view of the specified collection.
    1302      * Any attempt to insert an element of the wrong type will result in an
    1303      * immediate {@link ClassCastException}.  Assuming a collection
    1304      * contains no incorrectly typed elements prior to the time a
    1305      * dynamically typesafe view is generated, and that all subsequent
    1306      * access to the collection takes place through the view, it is
    1307      * <i>guaranteed</i> that the collection cannot contain an incorrectly
    1308      * typed element.
    1309      *
    1310      * <p>The generics mechanism in the language provides compile-time
    1311      * (static) type checking, but it is possible to defeat this mechanism
    1312      * with unchecked casts.  Usually this is not a problem, as the compiler
    1313      * issues warnings on all such unchecked operations.  There are, however,
    1314      * times when static type checking alone is not sufficient.  For example,
    1315      * suppose a collection is passed to a third-party library and it is
    1316      * imperative that the library code not corrupt the collection by
    1317      * inserting an element of the wrong type.
    1318      *
    1319      * <p>Another use of dynamically typesafe views is debugging.  Suppose a
    1320      * program fails with a {@code ClassCastException}, indicating that an
    1321      * incorrectly typed element was put into a parameterized collection.
    1322      * Unfortunately, the exception can occur at any time after the erroneous
    1323      * element is inserted, so it typically provides little or no information
    1324      * as to the real source of the problem.  If the problem is reproducible,
    1325      * one can quickly determine its source by temporarily modifying the
    1326      * program to wrap the collection with a dynamically typesafe view.
    1327      * For example, this declaration:
    1328      *  <pre> {@code
    1329      *     Collection<String> c = new HashSet<>();
    1330      * }</pre>
    1331      * may be replaced temporarily by this one:
    1332      *  <pre> {@code
    1333      *     Collection<String> c = Collections.checkedCollection(
    1334      *         new HashSet<>(), String.class);
    1335      * }</pre>
    1336      * Running the program again will cause it to fail at the point where
    1337      * an incorrectly typed element is inserted into the collection, clearly
    1338      * identifying the source of the problem.  Once the problem is fixed, the
    1339      * modified declaration may be reverted back to the original.
    1340      *
    1341      * <p>The returned collection does <i>not</i> pass the hashCode and equals
    1342      * operations through to the backing collection, but relies on
    1343      * {@code Object}'s {@code equals} and {@code hashCode} methods.  This
    1344      * is necessary to preserve the contracts of these operations in the case
    1345      * that the backing collection is a set or a list.
    1346      *
    1347      * <p>The returned collection will be serializable if the specified
    1348      * collection is serializable.
    1349      *
    1350      * <p>Since {@code null} is considered to be a value of any reference
    1351      * type, the returned collection permits insertion of null elements
    1352      * whenever the backing collection does.
    1353      *
    1354      * @param <E> the class of the objects in the collection
    1355      * @param c the collection for which a dynamically typesafe view is to be
    1356      *          returned
    1357      * @param type the type of element that {@code c} is permitted to hold
    1358      * @return a dynamically typesafe view of the specified collection
    1359      * @since 1.5
    1360      */
    1361     //返回指定 collection 的一个动态类型安全视图。用以检测元素类型是否正确。 
    1362     public static <E> Collection<E> checkedCollection(Collection<E> c,
    1363                                                       Class<E> type) {
    1364         return new CheckedCollection<>(c, type);
    1365     }
    1366 
    1367     @SuppressWarnings("unchecked")
    1368     static <T> T[] zeroLengthArray(Class<T> type) {
    1369         return (T[]) Array.newInstance(type, 0);
    1370     }
    1371 
    1372     /**
    1373      * @serial include
    1374      */
    1375     static class CheckedCollection<E> implements Collection<E>, Serializable {
    1376         private static final long serialVersionUID = 1578914078182001775L;
    1377 
    1378         final Collection<E> c;
    1379         final Class<E> type;
    1380 
    1381         @SuppressWarnings("unchecked")
    1382         E typeCheck(Object o) {
    1383             if (o != null && !type.isInstance(o))
    1384                 throw new ClassCastException(badElementMsg(o));
    1385             return (E) o;
    1386         }
    1387 
    1388         private String badElementMsg(Object o) {
    1389             return "Attempt to insert " + o.getClass() +
    1390                 " element into collection with element type " + type;
    1391         }
    1392 
    1393         CheckedCollection(Collection<E> c, Class<E> type) {
    1394             this.c = Objects.requireNonNull(c, "c");
    1395             this.type = Objects.requireNonNull(type, "type");
    1396         }
    1397 
    1398         public int size()                 { return c.size(); }
    1399         public boolean isEmpty()          { return c.isEmpty(); }
    1400         public boolean contains(Object o) { return c.contains(o); }
    1401         public Object[] toArray()         { return c.toArray(); }
    1402         public <T> T[] toArray(T[] a)     { return c.toArray(a); }
    1403         public String toString()          { return c.toString(); }
    1404         public boolean remove(Object o)   { return c.remove(o); }
    1405         public void clear()               {        c.clear(); }
    1406 
    1407         public boolean containsAll(Collection<?> coll) {
    1408             return c.containsAll(coll);
    1409         }
    1410         public boolean removeAll(Collection<?> coll) {
    1411             return c.removeAll(coll);
    1412         }
    1413         public boolean retainAll(Collection<?> coll) {
    1414             return c.retainAll(coll);
    1415         }
    1416 
    1417         public Iterator<E> iterator() {
    1418             // JDK-6363904 - unwrapped iterator could be typecast to
    1419             // ListIterator with unsafe set()
    1420             final Iterator<E> it = c.iterator();
    1421             return new Iterator<E>() {
    1422                 public boolean hasNext() { return it.hasNext(); }
    1423                 public E next()          { return it.next(); }
    1424                 public void remove()     {        it.remove(); }};
    1425         }
    1426 
    1427         public boolean add(E e)          { return c.add(typeCheck(e)); }
    1428 
    1429         private E[] zeroLengthElementArray; // Lazily initialized
    1430 
    1431         private E[] zeroLengthElementArray() {
    1432             return zeroLengthElementArray != null ? zeroLengthElementArray :
    1433                 (zeroLengthElementArray = zeroLengthArray(type));
    1434         }
    1435 
    1436         @SuppressWarnings("unchecked")
    1437         Collection<E> checkedCopyOf(Collection<? extends E> coll) {
    1438             Object[] a;
    1439             try {
    1440                 E[] z = zeroLengthElementArray();
    1441                 a = coll.toArray(z);
    1442                 // Defend against coll violating the toArray contract
    1443                 if (a.getClass() != z.getClass())
    1444                     a = Arrays.copyOf(a, a.length, z.getClass());
    1445             } catch (ArrayStoreException ignore) {
    1446                 // To get better and consistent diagnostics,
    1447                 // we call typeCheck explicitly on each element.
    1448                 // We call clone() to defend against coll retaining a
    1449                 // reference to the returned array and storing a bad
    1450                 // element into it after it has been type checked.
    1451                 a = coll.toArray().clone();
    1452                 for (Object o : a)
    1453                     typeCheck(o);
    1454             }
    1455             // A slight abuse of the type system, but safe here.
    1456             return (Collection<E>) Arrays.asList(a);
    1457         }
    1458 
    1459         public boolean addAll(Collection<? extends E> coll) {
    1460             // Doing things this way insulates us from concurrent changes
    1461             // in the contents of coll and provides all-or-nothing
    1462             // semantics (which we wouldn't get if we type-checked each
    1463             // element as we added it)
    1464             return c.addAll(checkedCopyOf(coll));
    1465         }
    1466 
    1467         // Override default methods in Collection
    1468         @Override
    1469         public void forEach(Consumer<? super E> action) {c.forEach(action);}
    1470         @Override
    1471         public boolean removeIf(Predicate<? super E> filter) {
    1472             return c.removeIf(filter);
    1473         }
    1474         @Override
    1475         public Spliterator<E> spliterator() {return c.spliterator();}
    1476         @Override
    1477         public Stream<E> stream()           {return c.stream();}
    1478         @Override
    1479         public Stream<E> parallelStream()   {return c.parallelStream();}
    1480     }
    1481 
    1482     
    1483 
    1484 
    1485 
    1486   
    1487 
    1488     /**
    1489      * Returns an immutable list containing only the specified object.
    1490      * The returned list is serializable.
    1491      *
    1492      * @param  <T> the class of the objects in the list
    1493      * @param o the sole object to be stored in the returned list.
    1494      * @return an immutable list containing only the specified object.
    1495      * @since 1.3
    1496      */
    1497     //返回一个只包含指定对象的不可变列表。返回的列表是可序列化的。 
    1498     public static <T> List<T> singletonList(T o) {
    1499         return new SingletonList<>(o);
    1500     }
    1501 
    1502     /**
    1503      * @serial include
    1504      */
    1505     private static class SingletonList<E>
    1506         extends AbstractList<E>
    1507         implements RandomAccess, Serializable {
    1508 
    1509         private static final long serialVersionUID = 3093736618740652951L;
    1510 
    1511         private final E element;
    1512 
    1513         SingletonList(E obj)                {element = obj;}
    1514 
    1515         public Iterator<E> iterator() {
    1516             return singletonIterator(element);
    1517         }
    1518 
    1519         public int size()                   {return 1;}
    1520 
    1521         public boolean contains(Object obj) {return eq(obj, element);}
    1522 
    1523         public E get(int index) {
    1524             if (index != 0)
    1525               throw new IndexOutOfBoundsException("Index: "+index+", Size: 1");
    1526             return element;
    1527         }
    1528 
    1529         // Override default methods for Collection
    1530         @Override
    1531         public void forEach(Consumer<? super E> action) {
    1532             action.accept(element);
    1533         }
    1534         @Override
    1535         public boolean removeIf(Predicate<? super E> filter) {
    1536             throw new UnsupportedOperationException();
    1537         }
    1538         @Override
    1539         public void replaceAll(UnaryOperator<E> operator) {
    1540             throw new UnsupportedOperationException();
    1541         }
    1542         @Override
    1543         public void sort(Comparator<? super E> c) {
    1544         }
    1545         @Override
    1546         public Spliterator<E> spliterator() {
    1547             return singletonSpliterator(element);
    1548         }
    1549     }
    1550 
    1551     
    1552     // Miscellaneous
    1553 
    1554     /**
    1555      * Returns an immutable list consisting of <tt>n</tt> copies of the
    1556      * specified object.  The newly allocated data object is tiny (it contains
    1557      * a single reference to the data object).  This method is useful in
    1558      * combination with the <tt>List.addAll</tt> method to grow lists.
    1559      * The returned list is serializable.
    1560      *
    1561      * @param  <T> the class of the object to copy and of the objects
    1562      *         in the returned list.
    1563      * @param  n the number of elements in the returned list.
    1564      * @param  o the element to appear repeatedly in the returned list.
    1565      * @return an immutable list consisting of <tt>n</tt> copies of the
    1566      *         specified object.
    1567      * @throws IllegalArgumentException if {@code n < 0}
    1568      * @see    List#addAll(Collection)
    1569      * @see    List#addAll(int, Collection)
    1570      */
    1571     //返回由指定对象的 n 个副本组成的不可变列表。
    1572     //新分配的数据对象非常小(它只包含一个对该数据对象的引用)。在通过与 List.addAll 方法组合来增大列表时,此方法很有用 
    1573     public static <T> List<T> nCopies(int n, T o) {
    1574         if (n < 0)
    1575             throw new IllegalArgumentException("List length = " + n);
    1576         return new CopiesList<>(n, o);
    1577     }
    1578 
    1579     /**
    1580      * @serial include
    1581      */
    1582     private static class CopiesList<E>
    1583         extends AbstractList<E>
    1584         implements RandomAccess, Serializable
    1585     {
    1586         private static final long serialVersionUID = 2739099268398711800L;
    1587 
    1588         final int n;
    1589         final E element;
    1590 
    1591         CopiesList(int n, E e) {
    1592             assert n >= 0;
    1593             this.n = n;
    1594             element = e;
    1595         }
    1596 
    1597         public int size() {
    1598             return n;
    1599         }
    1600 
    1601         public boolean contains(Object obj) {
    1602             return n != 0 && eq(obj, element);
    1603         }
    1604 
    1605         public int indexOf(Object o) {
    1606             return contains(o) ? 0 : -1;
    1607         }
    1608 
    1609         public int lastIndexOf(Object o) {
    1610             return contains(o) ? n - 1 : -1;
    1611         }
    1612 
    1613         public E get(int index) {
    1614             if (index < 0 || index >= n)
    1615                 throw new IndexOutOfBoundsException("Index: "+index+
    1616                                                     ", Size: "+n);
    1617             return element;
    1618         }
    1619 
    1620         public Object[] toArray() {
    1621             final Object[] a = new Object[n];
    1622             if (element != null)
    1623                 Arrays.fill(a, 0, n, element);
    1624             return a;
    1625         }
    1626 
    1627         @SuppressWarnings("unchecked")
    1628         public <T> T[] toArray(T[] a) {
    1629             final int n = this.n;
    1630             if (a.length < n) {
    1631                 a = (T[])java.lang.reflect.Array
    1632                     .newInstance(a.getClass().getComponentType(), n);
    1633                 if (element != null)
    1634                     Arrays.fill(a, 0, n, element);
    1635             } else {
    1636                 Arrays.fill(a, 0, n, element);
    1637                 if (a.length > n)
    1638                     a[n] = null;
    1639             }
    1640             return a;
    1641         }
    1642 
    1643         public List<E> subList(int fromIndex, int toIndex) {
    1644             if (fromIndex < 0)
    1645                 throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);
    1646             if (toIndex > n)
    1647                 throw new IndexOutOfBoundsException("toIndex = " + toIndex);
    1648             if (fromIndex > toIndex)
    1649                 throw new IllegalArgumentException("fromIndex(" + fromIndex +
    1650                                                    ") > toIndex(" + toIndex + ")");
    1651             return new CopiesList<>(toIndex - fromIndex, element);
    1652         }
    1653 
    1654         // Override default methods in Collection
    1655         @Override
    1656         public Stream<E> stream() {
    1657             return IntStream.range(0, n).mapToObj(i -> element);
    1658         }
    1659 
    1660         @Override
    1661         public Stream<E> parallelStream() {
    1662             return IntStream.range(0, n).parallel().mapToObj(i -> element);
    1663         }
    1664 
    1665         @Override
    1666         public Spliterator<E> spliterator() {
    1667             return stream().spliterator();
    1668         }
    1669     }
    1670 
    1671     /**
    1672      * Returns a comparator that imposes the reverse of the <em>natural
    1673      * ordering</em> on a collection of objects that implement the
    1674      * {@code Comparable} interface.  (The natural ordering is the ordering
    1675      * imposed by the objects' own {@code compareTo} method.)  This enables a
    1676      * simple idiom for sorting (or maintaining) collections (or arrays) of
    1677      * objects that implement the {@code Comparable} interface in
    1678      * reverse-natural-order.  For example, suppose {@code a} is an array of
    1679      * strings. Then: <pre>
    1680      *          Arrays.sort(a, Collections.reverseOrder());
    1681      * </pre> sorts the array in reverse-lexicographic (alphabetical) order.<p>
    1682      *
    1683      * The returned comparator is serializable.
    1684      *
    1685      * @param  <T> the class of the objects compared by the comparator
    1686      * @return A comparator that imposes the reverse of the <i>natural
    1687      *         ordering</i> on a collection of objects that implement
    1688      *         the <tt>Comparable</tt> interface.
    1689      * @see Comparable
    1690      */
    1691     //返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。 
    1692     @SuppressWarnings("unchecked")
    1693     public static <T> Comparator<T> reverseOrder() {
    1694         return (Comparator<T>) ReverseComparator.REVERSE_ORDER;
    1695     }
    1696 
    1697     /**
    1698      * @serial include
    1699      */
    1700     private static class ReverseComparator
    1701         implements Comparator<Comparable<Object>>, Serializable {
    1702 
    1703         private static final long serialVersionUID = 7207038068494060240L;
    1704 
    1705         static final ReverseComparator REVERSE_ORDER
    1706             = new ReverseComparator();
    1707 
    1708         public int compare(Comparable<Object> c1, Comparable<Object> c2) {
    1709             return c2.compareTo(c1);
    1710         }
    1711 
    1712         private Object readResolve() { return Collections.reverseOrder(); }
    1713 
    1714         @Override
    1715         public Comparator<Comparable<Object>> reversed() {
    1716             return Comparator.naturalOrder();
    1717         }
    1718     }
    1719 
    1720     /**
    1721      * Returns a comparator that imposes the reverse ordering of the specified
    1722      * comparator.  If the specified comparator is {@code null}, this method is
    1723      * equivalent to {@link #reverseOrder()} (in other words, it returns a
    1724      * comparator that imposes the reverse of the <em>natural ordering</em> on
    1725      * a collection of objects that implement the Comparable interface).
    1726      *
    1727      * <p>The returned comparator is serializable (assuming the specified
    1728      * comparator is also serializable or {@code null}).
    1729      *
    1730      * @param <T> the class of the objects compared by the comparator
    1731      * @param cmp a comparator who's ordering is to be reversed by the returned
    1732      * comparator or {@code null}
    1733      * @return A comparator that imposes the reverse ordering of the
    1734      *         specified comparator.
    1735      * @since 1.5
    1736      */
    1737     //返回一个比较器,它强行逆转指定比较器的顺序。 
    1738     public static <T> Comparator<T> reverseOrder(Comparator<T> cmp) {
    1739         if (cmp == null)
    1740             return reverseOrder();
    1741 
    1742         if (cmp instanceof ReverseComparator2)
    1743             return ((ReverseComparator2<T>)cmp).cmp;
    1744 
    1745         return new ReverseComparator2<>(cmp);
    1746     }
    1747 
    1748     /**
    1749      * @serial include
    1750      */
    1751     private static class ReverseComparator2<T> implements Comparator<T>,
    1752         Serializable
    1753     {
    1754         private static final long serialVersionUID = 4374092139857L;
    1755 
    1756         /**
    1757          * The comparator specified in the static factory.  This will never
    1758          * be null, as the static factory returns a ReverseComparator
    1759          * instance if its argument is null.
    1760          *
    1761          * @serial
    1762          */
    1763         final Comparator<T> cmp;
    1764 
    1765         ReverseComparator2(Comparator<T> cmp) {
    1766             assert cmp != null;
    1767             this.cmp = cmp;
    1768         }
    1769 
    1770         public int compare(T t1, T t2) {
    1771             return cmp.compare(t2, t1);
    1772         }
    1773 
    1774         public boolean equals(Object o) {
    1775             return (o == this) ||
    1776                 (o instanceof ReverseComparator2 &&
    1777                  cmp.equals(((ReverseComparator2)o).cmp));
    1778         }
    1779 
    1780         public int hashCode() {
    1781             return cmp.hashCode() ^ Integer.MIN_VALUE;
    1782         }
    1783 
    1784         @Override
    1785         public Comparator<T> reversed() {
    1786             return cmp;
    1787         }
    1788     }
    1789 
    1790 
    1791 
    1792     /**
    1793      * Returns an array list containing the elements returned by the
    1794      * specified enumeration in the order they are returned by the
    1795      * enumeration.  This method provides interoperability between
    1796      * legacy APIs that return enumerations and new APIs that require
    1797      * collections.
    1798      *
    1799      * @param <T> the class of the objects returned by the enumeration
    1800      * @param e enumeration providing elements for the returned
    1801      *          array list
    1802      * @return an array list containing the elements returned
    1803      *         by the specified enumeration.
    1804      * @since 1.4
    1805      * @see Enumeration
    1806      * @see ArrayList
    1807      */
    1808     public static <T> ArrayList<T> list(Enumeration<T> e) {
    1809         ArrayList<T> l = new ArrayList<>();
    1810         while (e.hasMoreElements())
    1811             l.add(e.nextElement());
    1812         return l;
    1813     }
    1814 
    1815     /**
    1816      * Returns the number of elements in the specified collection equal to the
    1817      * specified object.  More formally, returns the number of elements
    1818      * <tt>e</tt> in the collection such that
    1819      * <tt>(o == null ? e == null : o.equals(e))</tt>.
    1820      *
    1821      * @param c the collection in which to determine the frequency
    1822      *     of <tt>o</tt>
    1823      * @param o the object whose frequency is to be determined
    1824      * @return the number of elements in {@code c} equal to {@code o}
    1825      * @throws NullPointerException if <tt>c</tt> is null
    1826      * @since 1.5
    1827      */
    1828     //返回指定 collection 中等于指定对象的元素数。
    1829     //更确切地讲,返回 collection 中满足 (o == null ? e == null : o.equals(e)) 的 e 元素的数量。 
    1830     public static int frequency(Collection<?> c, Object o) {
    1831         int result = 0;
    1832         if (o == null) {
    1833             for (Object e : c)
    1834                 if (e == null)
    1835                     result++;
    1836         } else {
    1837             for (Object e : c)
    1838                 if (o.equals(e))
    1839                     result++;
    1840         }
    1841         return result;
    1842     }
    1843 
    1844     /**
    1845      * Returns {@code true} if the two specified collections have no
    1846      * elements in common.
    1847      *
    1848      * <p>Care must be exercised if this method is used on collections that
    1849      * do not comply with the general contract for {@code Collection}.
    1850      * Implementations may elect to iterate over either collection and test
    1851      * for containment in the other collection (or to perform any equivalent
    1852      * computation).  If either collection uses a nonstandard equality test
    1853      * (as does a {@link SortedSet} whose ordering is not <em>compatible with
    1854      * equals</em>, or the key set of an {@link IdentityHashMap}), both
    1855      * collections must use the same nonstandard equality test, or the
    1856      * result of this method is undefined.
    1857      *
    1858      * <p>Care must also be exercised when using collections that have
    1859      * restrictions on the elements that they may contain. Collection
    1860      * implementations are allowed to throw exceptions for any operation
    1861      * involving elements they deem ineligible. For absolute safety the
    1862      * specified collections should contain only elements which are
    1863      * eligible elements for both collections.
    1864      *
    1865      * <p>Note that it is permissible to pass the same collection in both
    1866      * parameters, in which case the method will return {@code true} if and
    1867      * only if the collection is empty.
    1868      *
    1869      * @param c1 a collection
    1870      * @param c2 a collection
    1871      * @return {@code true} if the two specified collections have no
    1872      * elements in common.
    1873      * @throws NullPointerException if either collection is {@code null}.
    1874      * @throws NullPointerException if one collection contains a {@code null}
    1875      * element and {@code null} is not an eligible element for the other collection.
    1876      * (<a href="Collection.html#optional-restrictions">optional</a>)
    1877      * @throws ClassCastException if one collection contains an element that is
    1878      * of a type which is ineligible for the other collection.
    1879      * (<a href="Collection.html#optional-restrictions">optional</a>)
    1880      * @since 1.5
    1881      */
    1882      
    1883     //如果两个指定 collection 中没有相同的元素,则返回 true。 
    1884     //如果将此方法用在不符合 Collection 常规协定的 collection 上,则必须小心。
    1885     //实现可以在任一 collection 上进行迭代,测试元素是否包含在另一个 collection 中(或执行任何等效的计算)。
    1886     //如果任一 collection 使用了一个非标准的相等性测试(比如顺序不是与 equals 一致的 SortedSet,
    1887     //或者 IdentityHashMap 的键集),则两个 collection 
    1888     //都必须使用相同的非标准相等性测试,否则此方法的结果是不确定的。 
    1889     //注意,允许在两个参数中传递相同的 collection,在这种情况下,当且仅当 collection 为空时此方法返回 true。 
    1890     public static boolean disjoint(Collection<?> c1, Collection<?> c2) {
    1891         // The collection to be used for contains(). Preference is given to
    1892         // the collection who's contains() has lower O() complexity.
    1893         Collection<?> contains = c2;
    1894         // The collection to be iterated. If the collections' contains() impl
    1895         // are of different O() complexity, the collection with slower
    1896         // contains() will be used for iteration. For collections who's
    1897         // contains() are of the same complexity then best performance is
    1898         // achieved by iterating the smaller collection.
    1899         Collection<?> iterate = c1;
    1900 
    1901         // Performance optimization cases. The heuristics:
    1902         //   1. Generally iterate over c1.
    1903         //   2. If c1 is a Set then iterate over c2.
    1904         //   3. If either collection is empty then result is always true.
    1905         //   4. Iterate over the smaller Collection.
    1906         if (c1 instanceof Set) {
    1907             // Use c1 for contains as a Set's contains() is expected to perform
    1908             // better than O(N/2)
    1909             iterate = c2;
    1910             contains = c1;
    1911         } else if (!(c2 instanceof Set)) {
    1912             // Both are mere Collections. Iterate over smaller collection.
    1913             // Example: If c1 contains 3 elements and c2 contains 50 elements and
    1914             // assuming contains() requires ceiling(N/2) comparisons then
    1915             // checking for all c1 elements in c2 would require 75 comparisons
    1916             // (3 * ceiling(50/2)) vs. checking all c2 elements in c1 requiring
    1917             // 100 comparisons (50 * ceiling(3/2)).
    1918             int c1size = c1.size();
    1919             int c2size = c2.size();
    1920             if (c1size == 0 || c2size == 0) {
    1921                 // At least one collection is empty. Nothing will match.
    1922                 return true;
    1923             }
    1924 
    1925             if (c1size > c2size) {
    1926                 iterate = c2;
    1927                 contains = c1;
    1928             }
    1929         }
    1930 
    1931         for (Object e : iterate) {
    1932             if (contains.contains(e)) {
    1933                // Found a common element. Collections are not disjoint.
    1934                 return false;
    1935             }
    1936         }
    1937 
    1938         // No common elements were found.
    1939         return true;
    1940     }
    1941 
    1942 
    1943   
    1944     /**
    1945      * Returns a view of a {@link Deque} as a Last-in-first-out (Lifo)
    1946      * {@link Queue}. Method <tt>add</tt> is mapped to <tt>push</tt>,
    1947      * <tt>remove</tt> is mapped to <tt>pop</tt> and so on. This
    1948      * view can be useful when you would like to use a method
    1949      * requiring a <tt>Queue</tt> but you need Lifo ordering.
    1950      *
    1951      * <p>Each method invocation on the queue returned by this method
    1952      * results in exactly one method invocation on the backing deque, with
    1953      * one exception.  The {@link Queue#addAll addAll} method is
    1954      * implemented as a sequence of {@link Deque#addFirst addFirst}
    1955      * invocations on the backing deque.
    1956      *
    1957      * @param  <T> the class of the objects in the deque
    1958      * @param deque the deque
    1959      * @return the queue
    1960      * @since  1.6
    1961      */
    1962     //以后进先出 (Lifo) Queue 的形式返回某个 Deque 的视图。
    1963     //方法 add 被映射到 push,remove 被映射到 pop 等等。
    1964     //在希望使用某一方法获取一个 Queue 并且需要它具有 Lifo 顺序时,此方法很有用。 
    1965     //每次在此方法返回的队列上调用方法都将导致在底层实现队列上调用该方法一次,
    1966     并伴随一个异常。addAll 方法是作为底层实现队列上的 addFirst 调用序列实现的。  
    1967     public static <T> Queue<T> asLifoQueue(Deque<T> deque) {
    1968         return new AsLIFOQueue<>(deque);
    1969     }
    1970 
    1971     /**
    1972      * @serial include
    1973      */
    1974     static class AsLIFOQueue<E> extends AbstractQueue<E>
    1975         implements Queue<E>, Serializable {
    1976         private static final long serialVersionUID = 1802017725587941708L;
    1977         private final Deque<E> q;
    1978         AsLIFOQueue(Deque<E> q)           { this.q = q; }
    1979         public boolean add(E e)           { q.addFirst(e); return true; }
    1980         public boolean offer(E e)         { return q.offerFirst(e); }
    1981         public E poll()                   { return q.pollFirst(); }
    1982         public E remove()                 { return q.removeFirst(); }
    1983         public E peek()                   { return q.peekFirst(); }
    1984         public E element()                { return q.getFirst(); }
    1985         public void clear()               {        q.clear(); }
    1986         public int size()                 { return q.size(); }
    1987         public boolean isEmpty()          { return q.isEmpty(); }
    1988         public boolean contains(Object o) { return q.contains(o); }
    1989         public boolean remove(Object o)   { return q.remove(o); }
    1990         public Iterator<E> iterator()     { return q.iterator(); }
    1991         public Object[] toArray()         { return q.toArray(); }
    1992         public <T> T[] toArray(T[] a)     { return q.toArray(a); }
    1993         public String toString()          { return q.toString(); }
    1994         public boolean containsAll(Collection<?> c) {return q.containsAll(c);}
    1995         public boolean removeAll(Collection<?> c)   {return q.removeAll(c);}
    1996         public boolean retainAll(Collection<?> c)   {return q.retainAll(c);}
    1997         // We use inherited addAll; forwarding addAll would be wrong
    1998 
    1999         // Override default methods in Collection
    2000         @Override
    2001         public void forEach(Consumer<? super E> action) {q.forEach(action);}
    2002         @Override
    2003         public boolean removeIf(Predicate<? super E> filter) {
    2004             return q.removeIf(filter);
    2005         }
    2006         @Override
    2007         public Spliterator<E> spliterator() {return q.spliterator();}
    2008         @Override
    2009         public Stream<E> stream()           {return q.stream();}
    2010         @Override
    2011         public Stream<E> parallelStream()   {return q.parallelStream();}
    2012     }
    2013 }
  • 相关阅读:
    CIFAR10-网络训练技术
    论文-Deep Residual Learning for Image Recognition
    Origin-作图相关
    OnCtlColor
    查看电脑MAC地址
    改变静态文本框和PictureControl的背景颜色
    MFC在对话框中的Picture contrl控件中添加icon图标,并改变icon图标的背景色与对话框背景色一致
    char型数组学习
    条件编译
    ASCII码
  • 原文地址:https://www.cnblogs.com/sqy123/p/9676097.html
Copyright © 2011-2022 走看看