Java中的集合工具類Collections詳解
Collections
java.utils.Collections是集合工具類,用來對(duì)集合進(jìn)行操作。不是Collection集合的根接口,這個(gè)要區(qū)分開來。 部分方法如下:
- public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
- public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
- public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序。
- public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。
使用Collections以后更加方便的創(chuàng)建添加元素,以及排序了,自帶排序方法。ArrayList是沒有自帶的排序方法。
public class CollectionsDemo { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); //原來寫法 //list.add(12); //list.add(14); //list.add(15); //list.add(1000); //采用工具類 完成 往集合中添加元素 Collections.addAll(list, 5, 222, 1,2); System.out.println(list); //排序方法 Collections.sort(list); System.out.println(list); } }
結(jié)果:
[5, 222, 1, 2]
[1, 2, 5, 222]
public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。接下來講解一下指定規(guī)則的排列。
Comparator比較器
public static <T> void sort(List<T> list):將集合中元素按照默認(rèn)規(guī)則排序。
public class CollectionsDemo2 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("cba"); list.add("aba"); list.add("sba"); list.add("nba"); //排序方法 Collections.sort(list); System.out.println(list); } }
結(jié)果輸出為:
[aba, cba, nba, sba]
我們使用的是默認(rèn)的規(guī)則完成字符串的排序,那么默認(rèn)規(guī)則是怎么定義出來的呢?
說到排序了,簡(jiǎn)單的說就是兩個(gè)對(duì)象之間比較大小,那么在JAVA中提供了兩種比較實(shí)現(xiàn)的方式,一種是比較死板的采用java.lang.Comparable接口去實(shí)現(xiàn),一種是靈活的當(dāng)我需要做排序的時(shí)候在去選擇的java.util.Comparator接口完成。
那么我們采用的public static <T> void sort(List<T> list)這個(gè)方法完成的排序,實(shí)際上要求了被排序的類型需要實(shí)現(xiàn)Comparable接口完成比較的功能,在String類型上如下:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
String類實(shí)現(xiàn)了這個(gè)接口,并完成了比較規(guī)則的定義,但是這樣就把這種規(guī)則寫死了,那比如我想要字符串按照第一個(gè)字符降序排列,那么這樣就要修改String的源代碼,這是不可能的了,那么這個(gè)時(shí)候我們可以使用
public static <T> void sort(List<T> list,Comparator<? super T> )方法靈活的完成,這個(gè)里面就涉及到了Comparator這個(gè)接口,位于位于java.util包下,排序是comparator能實(shí)現(xiàn)的功能之一,該接口代表一個(gè)比較器,比較器具有可比性!顧名思義就是做排序的,通俗地講需要比較兩個(gè)對(duì)象誰(shuí)排在前誰(shuí)排在后,那么比較的方法就是:
public int compare(String o1, String o2):比較其兩個(gè)參數(shù)的順序。
- 兩個(gè)對(duì)象比較的結(jié)果有三種:大于,等于,小于。
- 如果要按照升序排序,
- 則o1 小于o2,返回(負(fù)數(shù)),相等返回0,01大于02返回(正數(shù))
- 如果要按照降序排序
- 則o1 小于o2,返回(正數(shù)),相等返回0,01大于02返回(負(fù)數(shù))
操作如下:
public class CollectionsDemo3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add("cba"); list.add("aba"); list.add("sba"); list.add("nba"); //排序方法 按照第一個(gè)單詞的降序 Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.charAt(0) - o1.charAt(0); } }); System.out.println(list); } }
結(jié)果如下:
[sba, nba, cba, aba]
Comparable和Comparator兩個(gè)接口的區(qū)別
Comparable:強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實(shí)現(xiàn)compareTo()一次,不能經(jīng)常修改類的代碼實(shí)現(xiàn)自己想要的排序。實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過Collections.sort(和Arrays.sort)進(jìn)行自動(dòng)排序,對(duì)象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
Comparator強(qiáng)行對(duì)某個(gè)對(duì)象進(jìn)行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實(shí)現(xiàn)精確控制。還可以使用Comparator來控制某些數(shù)據(jù)結(jié)構(gòu)(如有序set或有序映射)的順序,或者為那些沒有自然順序的對(duì)象collection提供排序。
總結(jié)
Comparable是Collections內(nèi)部默認(rèn)的排序方法.然而Comparator是可以按照自己設(shè)計(jì)的方法來進(jìn)行排序。
到此這篇關(guān)于Java中的集合工具類Collections詳解的文章就介紹到這了,更多相關(guān)Java的Collections工具類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java.util.Collections類—emptyList()方法的使用
- 淺談Java中Collections.sort對(duì)List排序的兩種方法
- Java使用Collections.sort()排序的方法
- java安全之CommonsCollections4詳解
- Java中的Collections類的使用示例詳解
- Java中Collections.sort的使用
- Java的可變參數(shù)與Collections類的功能示例解析
- Java中Collection與Collections的區(qū)別詳解
- Java Collection和Collections的區(qū)別
- Java中Collections.sort()排序方法舉例詳解
- Java中Collection和Collections的區(qū)別
相關(guān)文章
Java詳解如何將excel數(shù)據(jù)轉(zhuǎn)為樹形
在平常的辦公工作中,excel數(shù)據(jù)的操作是最常見的需求,今天就來看一下通過Java如何來實(shí)現(xiàn)將excel數(shù)據(jù)轉(zhuǎn)為樹形,感興趣的朋友可以了解下2022-08-08Java導(dǎo)出多個(gè)excel表打包到zip文件中供客戶端另存為窗口下載實(shí)現(xiàn)方法
最近的項(xiàng)目有一個(gè)導(dǎo)出匯總數(shù)據(jù)的要求,考慮到用戶軟件的差異,所以要分別導(dǎo)出xls以及xlsx并且打包提供下載,下面這篇文章主要給大家介紹了關(guān)于Java導(dǎo)出多個(gè)excel表打包到zip文件中供客戶端另存為窗口下載的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-12-12Java 實(shí)戰(zhàn)項(xiàng)目之精品養(yǎng)老院管理系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)一個(gè)精品養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程
這篇文章主要介紹了Java搭建簡(jiǎn)單Netty開發(fā)環(huán)境入門教程,有詳細(xì)的代碼展示和maven依賴,能夠幫助你快速上手Netty開發(fā)框架,需要的朋友可以參考下2021-06-06基于Java創(chuàng)建一個(gè)訂單類代碼實(shí)例
這篇文章主要介紹了基于Java創(chuàng)建一個(gè)訂單類代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Spring Boot2.x集成JPA快速開發(fā)的示例代碼
這篇文章主要介紹了Spring Boot2.x集成JPA快速開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05