JDK源码解析之Java.util.Collections
java.util.Collections 是一個(gè)包裝類。它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法。此類不能實(shí)例化,就像一個(gè)工具類,服務(wù)于Java的Collection框架。
一、源碼解析
1、不可實(shí)例化
private Collections() {}Collections是util包中一個(gè)不可實(shí)例化的類。
2、優(yōu)化參數(shù)
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定義的這些變量叫做優(yōu)化參數(shù)(Tuning Parameter),其作用在于優(yōu)化類中方法的性能(permformance)。
3、排序函數(shù)sort()
3.1、根據(jù)元素的自然順序?qū)χ付斜戆瓷蜻M(jìn)行排序
@SuppressWarnings("unchecked")public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}參數(shù):要排序的列表。
3.2、根據(jù)指定比較器產(chǎn)生的順序?qū)χ付斜磉M(jìn)行排序。此列表內(nèi)的所有元素都必須可使用指定比較器相互比較。
@SuppressWarnings({"unchecked", "rawtypes"})public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}參數(shù):list-要排序的列表;c-確定列表順序的比較器。
3.3、關(guān)于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);}}首先,傳入一個(gè)比較器作為參數(shù),然后就是將list轉(zhuǎn)換成一個(gè)數(shù)組,再對(duì)這個(gè)數(shù)組進(jìn)行排序,排序完之后,再利用iterator重新改變list。
4、二分查找方法binarySearch()
Collection中binarySearch及其相關(guān)的方法有很多,這里只選兩個(gè)有代表性的
4.1、使用二分搜索法搜索指定列表,以獲得指定對(duì)象,在進(jìn)行此方法調(diào)用前比較要將列表元素按照升序排序,否則結(jié)果不確定,此方法會(huì)執(zhí)行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);}參數(shù): list-要搜索的鏈表,key-要搜索的鍵。
4.2、根據(jù)指定的比較器對(duì)列表進(jìn)行升序排序。
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);}參數(shù):list-要搜索的列表,key-要搜索的鍵,c-排序列表的比較器。
5、反轉(zhuǎn)方法reverse()
轉(zhuǎn)指定列表中元素的順序,此方法以線性時(shí)間運(yùn)行。
@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);}} }? 參數(shù):list-元素要被反轉(zhuǎn)的列表
6、改組方法shuffle()
6.1、用默認(rèn)隨機(jī)源對(duì)指定列表進(jìn)行置換,所有置換發(fā)生的可能性都是大致相等的
public static void shuffle(List<?> list) {Random rnd = r;if (rnd == null)r = rnd = new Random(); // harmless race.shuffle(list, rnd);}參數(shù):list-要改組的列表
6.2、用指定的隨機(jī)源對(duì)指定列表進(jìn)行置換
@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]);}} }參數(shù):list-要改組的列表,rnd-用來(lái)改組列表的隨機(jī)源。
7、其他主要方法
7.1、交換方法swap()
- ? 函數(shù)定義:public static void swap(List<?> list,int i,int j)
- ? 在指定列表的指定位置處交換元素。
- ? 參數(shù):list-進(jìn)行元素交換的列表,i-要交換的一個(gè)元素的索引,j-要交換的另一個(gè)元素的索引。
7.2、替換方法fill()
- ? 函數(shù)定義:public static void fill(List<? super T> list,T obj)
- ? 使用指定元素替換指定列表中的所有元素,線性時(shí)間運(yùn)行。
- ? 參數(shù):list-使用指定元素填充的列表,obj-用來(lái)填充指定列表的元素。
7.3、復(fù)制方法copy()
- ? 函數(shù)定義:public static void copy(List<? super T> dest,List<? extends T> src)
- ? 將所有元素從一個(gè)列表復(fù)制到另一個(gè)列表。執(zhí)行此操作后,目標(biāo)列表中每個(gè)已復(fù)制元素的索引將等同于源列表中該元素的索引,目標(biāo)列表的長(zhǎng)度至少必須等于源列表。
- ? 參數(shù):dest-目標(biāo)列表,src-源列表。
7.4、最小值法min()
-
? 函數(shù)定義:public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
-
? 根據(jù)元素的自然順序返回給定Collection的最小元素,Collection中的所有元素必須實(shí)現(xiàn)Comparable接口,此外,collection中的所有元素都必須是可相互比較的。
-
? 參數(shù):coll-將確定其最小元素的collection。
-
? 函數(shù)定義:public static T min(Collection<? extends T> coll,Comparator<? super T> comp)
-
? 根據(jù)指定比較器產(chǎn)生的順序,返回給定collection的最小元素。
-
? 參數(shù):coll-將確定其最小元素的collection,comp-用來(lái)確定最小元素的比較器。
7.5、最大值方法max()
- ? 函數(shù)定義:public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
- ? 根據(jù)元素的自然順序,返回給定collection的最大元素。
- ? 參數(shù):coll-將確定其最大元素的collection。
- ? 函數(shù)定義:public static T max(Collection<?extends T> coll,Comparator<? super T> comp)
- ? 根據(jù)指定比較器產(chǎn)生的順序,返回給定collection的最大元素。
- ? 參數(shù):coll-將確定其最大元素的collection,comp-用來(lái)確定最大元素的比較器
7.6、輪換方法rotate()
- ? 函數(shù)定義:public static void rotate(List<?> list,int distance)
- ? 根據(jù)指定的距離輪轉(zhuǎn)指定列表中的元素。
- ? 參數(shù):list-要輪換的列表,distance-列表輪換的距離,可以使0、負(fù)數(shù)或者大于list.size()的數(shù)。
7.7、替換所有函數(shù)replaceAll()
- ? 函數(shù)定義:public static boolean replaceAll(List list,T oldVal,T newVal)
- ? 使用另一個(gè)值替換列表總出現(xiàn)的所有的某一指定值。
- ? 參數(shù):list-在其中進(jìn)行替換的列表;oldVal-將被替換的原值;newVal-替換oldVald的新值。
二、Collection和Collections區(qū)別
1.Collection:
Collection是集合類的上層接口。本身是一個(gè)Interface,里面包含了一些集合的基本操作。
Collection接口是Set接口和List接口的父接口
2.Collections
Collections是一個(gè)集合框架的幫助類,里面包含一些對(duì)集合的排序,搜索以及序列化的操作。
Collections是一個(gè)類,
Collections 是一個(gè)包裝類,Collection 表示一組對(duì)象,這些對(duì)象也稱為 collection 的元素。一些 collection 允許有重復(fù)的元素, 而另一些則不允許,一些 collection 是有序的,而另一些則是無(wú)序的。
總結(jié)
以上是生活随笔為你收集整理的JDK源码解析之Java.util.Collections的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux系统的基本安装
- 下一篇: HDFS常用Shell命令