Java基礎(chǔ) 淺談常用的集合類

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

2.jpg

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


2.png

對(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ì)列和棧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容