“簡單不先于復(fù)雜,而是在復(fù)雜之后.” —— Alan Perlis

推薦鏈接——http://www.itdecent.cn/p/ba0fdee47cb4

對(duì)于集合,大家都不陌生了,常見的集合接口Set、List、Map等,其中Set和List繼承自Collection。
Collection是一組對(duì)象的集合,而Map存儲(chǔ)的方式不一樣,他是以鍵值對(duì)的形式存放多個(gè)對(duì)象的。
Set和List又有區(qū)別,Set中的元素?zé)o序且不重復(fù),而List中的元素則是有序且允許重復(fù)的。
Set、List、Map都是接口類,定義的是規(guī)范,具體使用時(shí),還是需要其實(shí)現(xiàn)類的實(shí)例。一般我們見得比較多的就是HashSet、TreeSet、ArrayList、LinkedList、HashMap等,另外還有Vector、HashTable什么的,這個(gè)涉及了多線程中的線程安全以及性能問題,現(xiàn)在出場率比較低了。
Set:HashSet、TreeSet
關(guān)于去重:Set的中判斷放入元素是否重復(fù),都是基于對(duì)象的equals()方法的返回值來實(shí)現(xiàn)的。
關(guān)于順序和排序:其實(shí)作為無序的Set,本身應(yīng)該是不具備排序功能的,因?yàn)楦揪蜎]有順序。
HashSet對(duì)于元素的存儲(chǔ)位置是取決放入對(duì)象的HashCode,是散列形式的;另外,還有一個(gè)名叫LinkedHashSet的實(shí)現(xiàn)類,除了使用HashCode來決定元素位置之外,同時(shí)還是用了鏈表來維護(hù)元素的次序(Linked),因此對(duì)其插入元素時(shí),看起來是有序的;
以下資料為網(wǎng)絡(luò)摘抄:
摘自:
http://www.cnblogs.com/Terry-greener/archive/2011/12/02/2271707.html
TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。
向TreeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關(guān)系,然后將元素按照升序排列。Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)了該接口的對(duì)象就可以比較大小。obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個(gè)對(duì)象相等,如果返回一個(gè)正數(shù),則表明obj1大于obj2,如果是 負(fù)數(shù),則表明obj1小于obj2。如果我們將兩個(gè)對(duì)象的equals方法總是返回true,則這兩個(gè)對(duì)象的compareTo方法返回應(yīng)該返回0。
定制排序
自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應(yīng)該使用Comparator接口,實(shí)現(xiàn) int compare(T o1,T o2)方法。
從上面的引文可以看出,對(duì)于集合的排序可以使用元素本身比較大小的方法(前提是實(shí)現(xiàn)了Comparable接口的對(duì)象);或者去實(shí)現(xiàn)Comparator接口的compare()方法來自定義一套比較大小的邏輯。
List:ArrayList、LinkedList
ArrayList
ArrayList是List接口動(dòng)態(tài)數(shù)組的實(shí)現(xiàn)方式。數(shù)組的特點(diǎn)是其中的元素在內(nèi)存中的地址是連續(xù)的。所以ArrayList的優(yōu)點(diǎn)在于get、set的效率高。缺點(diǎn)是在ArrayList中插入和刪除效率較低,由于每插入/刪除一項(xiàng),都需要移動(dòng)后續(xù)所有項(xiàng)的位置.
ArrayList的常用方法包括get、set、size、isEmpty、add、remove、clear、toArray、contains、indexOf、lastIndexOf、ensureCapacity等方法。
LinkedList
LinkedList是采用雙向鏈表實(shí)現(xiàn)的。所以它也具有鏈表的特點(diǎn),每一個(gè)元素(結(jié)點(diǎn))的地址不連續(xù),通過引用找到當(dāng)前結(jié)點(diǎn)的上一個(gè)結(jié)點(diǎn)和下一個(gè)結(jié)點(diǎn),即插入和刪除效率較高,只需要常數(shù)時(shí)間,而get和set則較為低效,
LinkedList的方法和使用和ArrayList大致相同,由于LinkedList是鏈表實(shí)現(xiàn)的,所以額外提供了在頭部和尾部添加/刪除元素的方法,也沒有ArrayList擴(kuò)容的問題了。另外,ArrayList和LinkedList都可以實(shí)現(xiàn)棧、隊(duì)列等數(shù)據(jù)結(jié)構(gòu),但LinkedList本身實(shí)現(xiàn)了隊(duì)列的接口,所以更推薦用LinkedList來實(shí)現(xiàn)隊(duì)列和棧。