java基礎—經常使用的集合類有哪些?好比List如何排序?

java基礎—經常使用的集合類有哪些?好比List如何排序?

2017年12月04日 16:41:57 閱讀數:2282 標籤: java set list map 更多java

我的分類: java 數組

經常使用的集合類有哪些?好比List如何排序?安全

Set、List、Map.png網絡

Java中經常使用的集合類


對於集合,你們都不陌生了,常見的集合接口Set、List、Map等,其中Set和List繼承自Collection。


Collection是一組對象的集合,而Map存儲的方式不同,他是以鍵值對的形式存放多個對象的。


Set和List又有區別,Set中的元素無序且不重複,而List中的元素則是有序且容許重複的。


Set、List、Map都是接口類,定義的是規範,具體使用時,仍是須要其實現類的實例。通常咱們見得比較多的就是HashSet、TreeSet、ArrayList、LinkedList、HashMap等,另外還有Vector、HashTable什麼的,這個涉及了多線程中的線程安全以及性能問題,如今出場率比較低了。


Set:HashSet、TreeSet


說實話,就我的經歷而言,Set的使用比較少,僅在對Map使用Entry的方式進行遍歷的時候,用到過Set的實現類。


關於去重:Set的中判斷放入元素是否重複,都是基於對象的equals()方法的返回值來實現的。


關於順序和排序:其實做爲無序的Set,自己應該是不具有排序功能的,由於根本就沒有順序。
HashSet對於元素的存儲位置是取決放入對象的HashCode,是散列形式的;另外,還有一個名叫LinkedHashSet的實現類,除了使用HashCode來決定元素位置以外,同時仍是用了鏈表來維護元素的次序(Linked),所以對其插入元素時,看起來是有序的;
TreeSet,這個實現類沒有接觸過,如下資料爲網絡摘抄:


TreeSet是SortedSet接口的惟一實現類,TreeSet能夠確保集合元素處於排序狀態。TreeSet支持兩種排序方式,天然排序 和定製排序,其中天然排序爲默認的排序方式。
向TreeSet中加入的應該是同一個類的對象。TreeSet判斷兩個對象不相等的方式是兩個對象經過equals方法返回false,或者經過CompareTo方法比較沒有返回0
天然排序
天然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,而後將元素按照升序排列。Java提供了一個Comparable接口,該接口裏定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就能夠比較大小。obj1.compareTo(obj2)方法若是返回0,則說明被比較的兩個對象相等,若是返回一個正數,則代表obj1大於obj2,若是是 負數,則代表obj1小於obj2。若是咱們將兩個對象的equals方法老是返回true,則這兩個對象的compareTo方法返回應該返回0。
定製排序
天然排序是根據集合元素的大小,以升序排列,若是要定製排序,應該使用Comparator接口,實現 int compare(T o1,T o2)方法。
比較大小的2個接口.jpg
從上面的引文能夠看出,對於集合的排序可使用元素自己比較大小的方法(前提是實現了Comparable接口的對象);或者去實現Comparator接口的compare()方法來自定義一套比較大小的邏輯。


List:ArrayList、LinkedList


這2個應該是很常見的集合實現類了,一個是基於數組的原理存儲元素,一個是使用鏈表的形式存儲元素,具體的區別不在贅述。
總之,List是有順序的,所以List確定是能夠排序的。考慮到這一點,Java創造者們早就給咱們準備好了趁手的工具——Collections,長得有點像Set和List的お父さん(父親),其實根本不是一個世界的人(類);


關於Collections
這是官方提供的一個處理集合的工具方法的集合,本人最熟悉的就是他的sort()方法,對,就是這個排序用的方法,下面咱們就來仔細看看這個便利的方法吧。


sort()方法排序的本質其實也是藉助Comparable接口和Comparator接口的實現,通常有2種用法:
一、直接將須要排序的list做爲參數傳入,此時list中的對象必須實現了Comparable接口,而後sort會按升序的形式對元素進行排序;
二、傳入list做爲第一個參數,同時追加一個Comparator的實現類做爲第二個參數,而後sort方法會根據Comparator接口的實現類的邏輯,按升序進行排序;
這裏可能有朋友會問,爲何都是升序沒有降序。
其實所謂升或者降都是你本身規定的,sort()方法只是將比較結果爲-1的放前面,0的放中間,1的放後面;若是你想實現降序排列,那就在Comparator方法的實現類中,逆轉compare的返回結果就好了。


Map:HashMap


看到前面的Set和List的實現類裏面前綴都有Array(數組實現),Hash(哈希),Linked(鏈表)這幾種存儲方式的實現,我腦洞了一下Map是否是也有ArrayMap呢?


沒有直接百度,而是直接在IDE中去new ArrayMap<K,V>(),發現編譯通不過,看來1.7的JDK是不支持了。


而後開啓度娘模式發現,竟然Android裏面有提到,看來我也不算腦洞了。


HashMap算是開發中使用得最多的了,很方法的鍵值對形式(內在是一個一個散列分佈的Entry<K,V>,所以但是使用Set<Entry<K,V>>的方式遍歷);


本人對於HashMap基本上遍歷多,排序少,從其前綴的Hash能夠看出,其鍵值對的存放應該也是根據key的HashCode進行存放;所以,HashMap自己應該是沒法排序的,因此跟Set同樣,官方也沒有提供對應的排序方法。


不過,咱們能夠進行DIY,譬如把HashMap中的key存入可排序的list,進行排序,而後遍歷的時候,經過list或許到key以後,再從Map獲取值這樣就按照key進行排序了。
若是要按照value進行排序就複雜一點,能夠把Entry對象放進list,而後本身實現比較器,根據value進行排序。
嗯,還有更多更快更優的方法,你們均可以發散思惟。


另外提一嘴,Map中還有TreeMap和LinkedHashMap,其特色就跟Set中的那兩位同樣同樣的。


寫在文尾的體會


不論是Set、List仍是Map,根據其不一樣的特性,有不一樣的應用場景。


對於排序的問題,根據各類實現類的前綴,瞭解實現中的元素存儲方式,能夠知道是有序仍是無序。由此,能夠知道排序是使用官方工具,仍是須要自行實現對應的方法。


不論官方仍是DIY,總之要繼續排序的基本原理都是藉助Comparable接口和Comparator接口的實現,那麼不論待處理的集合是怎樣的,咱們都有辦法應對了多線程

相關文章
相關標籤/搜索