JDK源碼解析之Java.util.Collections

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 是有序的,而另一些則是無序的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535637.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535637.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535637.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu下安裝jdk

安裝1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安裝1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 轉載:http:/…

使用validate驗證數據庫

驗證數據備份集是不是可以用來做恢復和數據文件是否損壞、壞塊 三種方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…

JDK源碼解析之java.util.AbstractCollection

AbstractCollection類提供了collection的實現類應該具有的基本方法&#xff0c;具有一定的普適性&#xff0c;可以從大局上了解collection實現類的主要功能。 java.util.AbstractCollection這個類提供了對接口Collection骨骼級的實現。 一、源碼解析 1、iterator():返回一個迭…

溝通linux與windows的wine

據Netcraft網站調查&#xff0c;現在互聯網上的主機有75&#xff05;以上采用Linux作為操作系統。作為服務器操作系統&#xff0c;Linux已經站穩了腳步&#xff0c;可是在桌面 操作系統上&#xff0c;還是微軟的“瘟到死”一支獨秀。這倒不是說Linux不好&#xff0c;很大原因我…

備份spfil、控制文件等

delete backup&#xff1b; delete backupset delete noprompt backup backup keep forver database 永久保存恢復目錄中支持此命令 show parameter control 備份spfile backup spfile backup current contrlfile configure controlfile autoback …

日常問題——阿里云服務器ssh經常一段時間就斷掉解決辦法

#vim /etc/ssh/sshd_config 找到下面兩行 #ClientAliveInterval 0 #ClientAliveCountMax 3 去掉注釋&#xff0c;改成 ClientAliveInterval 30 ClientAliveCountMax 86400 這兩行的意思分別是 1、客戶端每隔多少秒向服務發送一個心跳數據 2、客戶端多少秒沒有相應&#…

在Ubuntu 8.04 LTS(hardy)下安裝配置nginx和fastcgi方式的php

最近我們(瑞豪開源Xen VPS: http://www.RasHost.com)的一個客戶要求在他的Ubuntu 8.04 VPS上安裝一個高性能的nginx&#xff0c;下面是我的安裝記錄。 由于Ubuntu 804已經包含了nginx&#xff0c;所以根本不要編譯&#xff0c;安裝超簡單&#xff01; 在VPS上修改/etc/apt/so…

apt-get包管理詳解

apt-get使用source.list文件進行軟件包管理。如果您想了解關于如何編輯和更新source.list中的條目的信息&#xff0c;請參閱SourcesList“起初GNU/Linux系統中只有.tar.gz。用戶必須自己編譯他們想使用的每一個程序。在Debian出現之後&#xff0c;人們認為有必要在系統中添 加一…

awk命令

awk是一個強大的文本分析工具&#xff0c;相對于grep的查找&#xff0c;sed的編輯&#xff0c;awk在其對數據分析并生成報告時&#xff0c;顯得尤為強大。簡單來說awk就是把文件逐行的讀入&#xff0c;以空格為默認分隔符將每行切片&#xff0c;切開的部分再進行各種分析處理。…

ubuntu安裝字符集

sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN

正則表達式和grep

正則表達式(regular expression, RE)是一種字符模式&#xff0c;用于在查找過程中匹配指定的字符。 在大多數程序里&#xff0c;正則表達式都被置于兩個正斜杠之間;例如/lv[o0]e/就是由正斜杠界定的正則表達式&#xff0c;它將匹配被查找的行中任何位置出現的相同模式。在正則表…

GC 垃圾回收

垃圾回收機制是由垃圾收集器Garbage Collection GC來實現的&#xff0c;GC是后臺的守護進程。它的特別之處是它是一個低優先級進程&#xff0c;但是可以根據內存的使用情況動態的調整他的優先級。因此&#xff0c;它是在內存中低到一定限度時才會自動運行&#xff0c;從而實現對…

如何讓你變得魅力十足

我們每個人都希望自己在某些方面對他人來說是有用的。我們渴望那種被人需要的感覺&#xff0c;覺得自己是有能力的&#xff0c;就像我們在某方面很與眾不同&#xff0c;很獨特一樣。 有些人非常有吸引力。他們是那些每當需要幫助便會被想起的人。他們是那些另你覺得非常有幫助…

日志linux

syslog日志系統&#xff1a; syslogd 系統&#xff0c;非內核產生的信息 man 2 syslog klogd 內核&#xff0c;專門負責內核產生的信息 man 3 syslog /var/log/messages 系統標準錯誤日志信息&#xff0c;非內核 syslogd /var/log/dmesg klogd 共同配置文件etc/…

sysbench的安裝和做性能測試

sysbench是一個模塊化的、跨平臺、多線程基準測試工具&#xff0c;主要用于評估測試各種不同系統參數下的數據庫負載情況。關于這個項目的詳細介紹請看&#xff1a;http://sysbench.sourceforge.net。它主要包括以下幾種方式的測試&#xff1a;1、cpu性能2、磁盤io性能3、調度程…

加密解密

PKI public key Infrastructure 公鑰基礎設施 CRl 證書吊銷列表 CA證書頒發機構 Certificate Authority x509 證書 包括公鑰、過期時間、證書的合法擁有者、證書如何被使用 CA的信息 CA的校驗碼等等 Pki實現方式 TLS/ssl:x509 opengpg ssl安全的套接字層…

高性能MySQL(1)——MYSQL架構

MySQL最重要、最與眾不同的特性是它的存儲引擎架構&#xff0c;這種架構將查詢處理與數據的存儲/提取相分離&#xff0c;使得可以在使用時根據不同的需求來選擇數據存儲的方式。 一、Mysql邏輯架構 如果能在頭腦中構建出一幅MySQL各組件之間如何協同工作的架構圖&#xff0c;就…

數據庫設計中的14個關鍵技巧

1. 原始單據與實體之間的關系  可以是一對一、一對多、多對多的關系。在一般情況下&#xff0c;它們是一對一的關系&#xff1a;即一張原始單據對應且只對應一個實體。在特殊情況下&#xff0c;它們可能是一對多或多對一的關系&#xff0c;即一張原始單證對應多個實體&#xf…

高性能MySQL(2)——Schema與數據類型的優化

良好的邏輯設計和物理設計是高性能的基石&#xff0c;應該根據系統將要執行的查詢語句來設計 schema,這往往需要權衡各種因素。 一、選擇優化的數據類型 MySQL支持的數據類型非常多&#xff0c;選擇正確的數據類型對于獲得高性能至關重要。不管 存儲哪種類型的數據&#xff0c…

用戶權限sudo、suid、sgid以及facl等

su 切換用戶或以指定用戶運行命令。 使用su可以指定運行命令的身份(user/group/uid/gid)。 為了向后兼容&#xff0c;su默認不會改變當前目錄&#xff0c;且僅設置HOME和SHELL這兩個環境變量(若目標用戶非root&#xff0c;則還設置USER和LOGNAME環境變量)。推薦使用--login選項…