java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務于Java的Collection框架。
一、源碼解析
1、不可實例化
private Collections() {}
Collections
是util包中一個不可實例化的類。
2、優化參數
private static final int BINARYSEARCH_THRESHOLD = 5000;private static final int REVERSE_THRESHOLD = 18;private static final int SHUFFLE_THRESHOLD = 5;private static final int FILL_THRESHOLD = 25;private static final int ROTATE_THRESHOLD = 100;private static final int COPY_THRESHOLD = 10;private static final int REPLACEALL_THRESHOLD = 11;private static final int INDEXOFSUBLIST_THRESHOLD = 35;
Collecions定義的這些變量叫做優化參數(Tuning Parameter),其作用在于優化類中方法的性能(permformance)。
3、排序函數sort()
3.1、根據元素的自然順序對指定列表按升序進行排序
@SuppressWarnings("unchecked")public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}
參數:要排序的列表。
3.2、根據指定比較器產生的順序對指定列表進行排序。此列表內的所有元素都必須可使用指定比較器相互比較。
@SuppressWarnings({"unchecked", "rawtypes"})public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}
參數:list-要排序的列表;c-確定列表順序的比較器。
3.3、關于list.sort方法
List.sort是JDK在1.8增加的方法
@SuppressWarnings({"unchecked", "rawtypes"})default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (Object e : a) {i.next();i.set((E) e);}}
首先,傳入一個比較器作為參數,然后就是將list轉換成一個數組,再對這個數組進行排序,排序完之后,再利用iterator重新改變list。
4、二分查找方法binarySearch()
Collection中binarySearch及其相關的方法有很多,這里只選兩個有代表性的
4.1、使用二分搜索法搜索指定列表,以獲得指定對象,在進行此方法調用前比較要將列表元素按照升序排序,否則結果不確定,此方法會執行O(n)次鏈接遍歷和O(log n)次元素比較。
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key);elsereturn Collections.iteratorBinarySearch(list, key);}
參數: list-要搜索的鏈表,key-要搜索的鍵。
4.2、根據指定的比較器對列表進行升序排序。
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) {if (c==null)return binarySearch((List<? extends Comparable<? super T>>) list, key);if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key, c);elsereturn Collections.iteratorBinarySearch(list, key, c);}
參數:list-要搜索的列表,key-要搜索的鍵,c-排序列表的比較器。
5、反轉方法reverse()
轉指定列表中元素的順序,此方法以線性時間運行。
@SuppressWarnings({"rawtypes", "unchecked"})
public static void reverse(List<?> list) {int size = list.size();if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)swap(list, i, j);} else {// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator fwd = list.listIterator();ListIterator rev = list.listIterator(size);for (int i=0, mid=list.size()>>1; i<mid; i++) {Object tmp = fwd.next();fwd.set(rev.previous());rev.set(tmp);}}
}
? 參數:list-元素要被反轉的列表
6、改組方法shuffle()
6.1、用默認隨機源對指定列表進行置換,所有置換發生的可能性都是大致相等的
public static void shuffle(List<?> list) {Random rnd = r;if (rnd == null)r = rnd = new Random(); // harmless race.shuffle(list, rnd);}
參數:list-要改組的列表
6.2、用指定的隨機源對指定列表進行置換
@SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) {int size = list.size();if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {for (int i=size; i>1; i--)swap(list, i-1, rnd.nextInt(i));} else {Object[] arr = list.toArray();// Shuffle arrayfor (int i=size; i>1; i--)swap(arr, i-1, rnd.nextInt(i));// Dump array back into list// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator it = list.listIterator();for (int i=0; i<arr.length; i++) {it.next();it.set(arr[i]);}}
}
參數:list-要改組的列表,rnd-用來改組列表的隨機源。
7、其他主要方法
7.1、交換方法swap()
- ? 函數定義:public static void swap(List<?> list,int i,int j)
- ? 在指定列表的指定位置處交換元素。
- ? 參數:list-進行元素交換的列表,i-要交換的一個元素的索引,j-要交換的另一個元素的索引。
7.2、替換方法fill()
- ? 函數定義:public static void fill(List<? super T> list,T obj)
- ? 使用指定元素替換指定列表中的所有元素,線性時間運行。
- ? 參數:list-使用指定元素填充的列表,obj-用來填充指定列表的元素。
7.3、復制方法copy()
- ? 函數定義:public static void copy(List<? super T> dest,List<? extends T> src)
- ? 將所有元素從一個列表復制到另一個列表。執行此操作后,目標列表中每個已復制元素的索引將等同于源列表中該元素的索引,目標列表的長度至少必須等于源列表。
- ? 參數:dest-目標列表,src-源列表。
7.4、最小值法min()
-
? 函數定義:public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
-
? 根據元素的自然順序返回給定Collection的最小元素,Collection中的所有元素必須實現Comparable接口,此外,collection中的所有元素都必須是可相互比較的。
-
? 參數:coll-將確定其最小元素的collection。
-
? 函數定義:public static T min(Collection<? extends T> coll,Comparator<? super T> comp)
-
? 根據指定比較器產生的順序,返回給定collection的最小元素。
-
? 參數:coll-將確定其最小元素的collection,comp-用來確定最小元素的比較器。
7.5、最大值方法max()
- ? 函數定義:public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
- ? 根據元素的自然順序,返回給定collection的最大元素。
- ? 參數:coll-將確定其最大元素的collection。
- ? 函數定義:public static T max(Collection<?extends T> coll,Comparator<? super T> comp)
- ? 根據指定比較器產生的順序,返回給定collection的最大元素。
- ? 參數:coll-將確定其最大元素的collection,comp-用來確定最大元素的比較器
7.6、輪換方法rotate()
- ? 函數定義:public static void rotate(List<?> list,int distance)
- ? 根據指定的距離輪轉指定列表中的元素。
- ? 參數:list-要輪換的列表,distance-列表輪換的距離,可以使0、負數或者大于list.size()的數。
7.7、替換所有函數replaceAll()
- ? 函數定義:public static boolean replaceAll(List list,T oldVal,T newVal)
- ? 使用另一個值替換列表總出現的所有的某一指定值。
- ? 參數:list-在其中進行替換的列表;oldVal-將被替換的原值;newVal-替換oldVald的新值。
二、Collection和Collections區別
1.Collection:
Collection是集合類的上層接口。本身是一個Interface,里面包含了一些集合的基本操作。
Collection接口是Set接口和List接口的父接口
2.Collections
Collections是一個集合框架的幫助類,里面包含一些對集合的排序,搜索以及序列化的操作。
Collections是一個類,
Collections 是一個包裝類,Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復的元素, 而另一些則不允許,一些 collection 是有序的,而另一些則是無序的。