Java中常用到的集合包括三大類Set、List、Map。首先講一下自己對于這三大類集合的理解:
Set主要用到的是HashSet和TreeSet兩類。HashSet就目前我在工作中常用到的就是它的去重功能(實(shí)際工作中業(yè)務(wù)邏輯需要對集合數(shù)據(jù)進(jìn)行去重的時(shí)候)。這里就引出HashSet的基本特點(diǎn)了:
HashSet 無序、不允許有重復(fù)數(shù)據(jù)(基于equals方法的返回值實(shí)現(xiàn)去重)。另外,還有一個(gè)名叫LinkedHashSet的實(shí)現(xiàn)類,除了使用HashCode來決定元素位置之外,同時(shí)還是用了鏈表來維護(hù)元素的次序(Linked),因此對其插入元素時(shí),看起來是有序的。
TreeSet工作中沒有接觸,來一段網(wǎng)絡(luò)知識(shí):
TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。
向TreeSet中加入的應(yīng)該是同一個(gè)類的對象。TreeSet判斷兩個(gè)對象不相等的方式是兩個(gè)對象通過equals方法返回false,或者通過CompareTo方法比較大小返回0。
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關(guān)系,然后將元素按照升序排列。Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)了該接口的對象就可以比較大小。obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個(gè)對象相等,如果返回一個(gè)正數(shù),則表明obj1大于obj2,如果是 負(fù)數(shù),則表明obj1小于obj2。如果我們將兩個(gè)對象的equals方法總是返回true,則這兩個(gè)對象的compareTo方法返回應(yīng)該返回0。
定制排序
自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應(yīng)該使用Comparator接口,實(shí)現(xiàn) int compare(T o1,T o2)方法。
從上面的引文可以看出,對于集合的排序可以使用元素本身比較大小的方法(前提是實(shí)現(xiàn)了Comparable接口的對象);或者去實(shí)現(xiàn)Comparator接口的compare()方法來自定義一套比較大小的邏輯。
List分為ArrayList和LinkedList,List是有序集合,允許有重復(fù)數(shù)據(jù)的存在。前者是基于數(shù)組的原理存儲(chǔ)數(shù)據(jù),后者是基于鏈表的原理存儲(chǔ)數(shù)據(jù)。
List是有順序的,因此List肯定是可以排序的。考慮到這一點(diǎn),Java創(chuàng)造者們早就給我們準(zhǔn)備好了趁手的工具——Collections,長得有點(diǎn)像Set和List的お父さん(父親),其實(shí)根本不是一個(gè)世界的人(類);
關(guān)于Collections
這是官方提供的一個(gè)處理集合的工具方法的集合,下面來仔細(xì)看看這個(gè)便利的方法:
sort()方法排序的本質(zhì)其實(shí)也是借助Comparable接口和Comparator接口的實(shí)現(xiàn),一般有2種用法:
1、直接將需要排序的list作為參數(shù)傳入,此時(shí)list中的對象必須實(shí)現(xiàn)了Comparable接口,然后sort會(huì)按升序的形式對元素進(jìn)行排序;
2、傳入list作為第一個(gè)參數(shù),同時(shí)追加一個(gè)Comparator的實(shí)現(xiàn)類作為第二個(gè)參數(shù),然后sort方法會(huì)根據(jù)Comparator接口的實(shí)現(xiàn)類的邏輯,按升序進(jìn)行排序;
Map分為HashMap和LinkedHashMap。Map的存儲(chǔ)形式是以鍵值(Entry)對的方式存在的,存儲(chǔ)原理是根據(jù)key的hashcode值來進(jìn)行散列分布的。具體的實(shí)現(xiàn)原理會(huì)在“HashMap的實(shí)現(xiàn)原理”的文章里進(jìn)行詳解,這里不再贅述。
本文根據(jù)http://www.itdecent.cn/p/820fd1b89c6a歸納整理完成