前幾天學了Collecion集合,今天學習它對應的工具類Collections。
數組
什麼叫工具類?微信
工具類它是一種特殊的類,它的成員變量和成員方法,基本都是靜態的,使用起來特別方便,直接用類名就能夠調用,不用建立對象。工具
數組有一個對應工具類Arrays。學習
Object有一個對應的工具類Objects。this
集合Collection也有一個對應的工具類Collections。spa
後面加一個s也就成了對應的工具類,很是好記。.net
在學習以前,須要先了解下什麼叫可變參數。對象
1、可變參數
字面意思理解就是能夠變化的參數,再準確一點,可變的是參數的個數。blog
不要看這好像是個新的概念,其實很簡單,咱們基本每天都能見到。排序
如今有幾個很是簡單的需求:
求兩個整數之和;
求三個整數之和;
求四個整數之和;
按照我目前所學到的Java知識,我會這樣解決:
建立方法一,參數爲兩個int,返回值爲它們之和。
建立方法二,參數爲三個int,返回值爲它們三之和。
建立方法三,參數爲四個int,返回值爲它們四之和。
使用到的知識:方法重載。
那麼如今問題來了,這也太麻煩了吧,有沒有簡化方法?
有,可變參數就能夠,直接一個方法就能夠了:
可變參數格式:數據類型... 變量名。
可變參數本質上就是一個數組,能夠用加強for循環遍歷。
理論上可變參數的個數能夠無數個。
關於可變參數還有以下特色:
①一個參數列表只能有一個可變參數。
這個好理解,一個可變參數就能夠表明無數個參數,不必兩個。
②其餘類型的普通參數能夠用,但可變參數要放在後面。
這個也好理解,由於可變參數,參數數量可變,若是它放在前面,那麼不管傳多少個參數進來,都被它全盤接受了,因此要放後面。
2、Collections
其經常使用的主要有3個方法:
①addAll方法:添加方法
添加多個元素進入list集合,使用的即是可變參數,這樣的話比一個一個元素依次添加要方便些。
②sort方法:排序方法
如果數字,按照從小到大的順序排列;
如果字符串,則按照字符串首字母對應ASCII碼錶從小到大。
③shuffle方法:亂序方法
將集合中的全部元素打亂。
其中,Collections的sort方法排序是升序排列,若是咱們想自定義排序規則該怎麼辦?
比較器就能夠自定義排序。
3、比較器
Java裏面有兩個比較器:Comparator和Comparable。
咱們先定義一個Person類,成員變量有兩個:name和age;
如今要按照年齡排序怎麼辦?
1.Comparator
①建立三個Person對象,並添加進集合中。
②比較器Comparator:
使用匿名內部類,由於Comparator是一個接口,無法實例化建立對象,須要子類建立對象,由於子類對象只須要使用一次,因此但是使用匿名內部類。
此處的匿名內部類,就至關因而一個子類實現了Comparator接口,並重寫了compare方法。
③如何判斷升序仍是降序?
o1-o2,能夠記成,1到2,就是升序;
o2-o1,能夠記成,2到1,就是降序。
咱們要求是要比較年齡大小並降序排列,
因此是:o2.age-o1.age。
Comparator能夠用來自定義排序規則,好比說我剛纔是按照年齡大小降序排列,我如今又想升序排列了,直接重複一次步驟②,將③中的規則倒過來就行了。
2.Comparable
Comparable也是一個接口,它的做用也是能夠自定義規則,可是它是在類中就把規則制定好了,直接就可使用Collections的sort方法。
①將咱們建立的類實現Comparable比較器。
這樣作了,就能夠直接使用Collections的sort方法,否則會報錯。
最早開始,在第二節中,咱們用Collections調用sort方法,能夠將字符串和數字升序排序。
本質緣由就是由於String了和Integer類底層已經實現Comparable接口了,而且制定的規則就是升序排序。
如果咱們本身建立的類須要排序,就得本身實現Comparable比較器
②重寫Comparable的compareTo方法。
③制定排序規則:
this.o就至關於o1,o就至關於o2;
o1-o2,能夠記成1到2,就是升序;
o2-o1,能夠記成2到1,就是降序。
④添加三個Person對象
⑤Collections的sort方法若是比較的是person對象,就是咱們本身制定的規則,也就是降序。
3.Comparator和Comparable的區別
Comparable它是自定義類的默認排序規則,制定好了,那麼只要是和這個類有關的排序都按照這個規則來,若是要修改,須要修改在類中制定的默認規則。
Comparator更加的靈活:同一個類,我此次想升序排序,下次又想降序排序了,只須要匿名內部類重寫方法就行了,而且它可以覆蓋Comparable的規則。
這就是它們之間的區別,而且很容易把它們弄混淆,我想了一個笨方法來記它們:
Comparator,這是一個名詞,能夠直接拿來用,也就是匿名內部類。
Comparable,這是一個形容詞,不能直接拿來用,得用須要排序的類去實現它。
固然我這個說法不太準確,不過拿來理解區分它們仍是能夠的。
總結:
本文分享自微信公衆號 - 劉小愛(liuxiaoai946)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。