排隊的時候請學(xué)習(xí)List 不要Set

java零基礎(chǔ)入門-高級特性篇(一)? 集合

集合框架是一個非常重要的知識點,有了集合框架,我們在處理一些特殊的數(shù)據(jù)結(jié)構(gòu)的時候,可以直接用框架封裝好的工具來幫助我們解決問題。

java對于集合框架的設(shè)計比較復(fù)雜,但是如果我們前面的知識點都有掌握好,學(xué)起來應(yīng)該會減少很大的難度。

集合是什么

集合是用來存放對象引用的容器,對象是承載數(shù)據(jù)的載體,而集合可以將對象組成各種不同的數(shù)據(jù)結(jié)構(gòu)。當(dāng)我們需要將多個數(shù)據(jù)以某一種特定的結(jié)構(gòu)進行數(shù)據(jù)傳輸?shù)臅r候,集合就派上用場了。

首先說一下容器這個概念。我們在新建對象的時候,在內(nèi)存中劃分空間是隨機的,我們不能將他們以一種方式組織起來,簡單的說來就是無組織,無紀(jì)律。而如果我們在內(nèi)存中直接為集合劃分一個空間,然后將對象裝入集合,那么這些對象就是有組織,有紀(jì)律的對象。

使用集合對比

左邊是沒有容器來約束的,所以對象都是隨機存儲。而右圖紅色部分就是在裝入對象之前,首先開辟一塊內(nèi)存給集合容器,然后往容器里面存放對象,有了集合的約束,對象就會按照集合的要求來排列,比如這里用的List集合容器,對象就會被排列成隊列。

最常用的集合結(jié)構(gòu)有3種,List 有序隊列,Set無序隊列,Map 鍵值對。

List 有序集合

通過名字就看到了,List集合是按順序存放對象的,每個對象都有自己的下標(biāo),第一個0,第二個1,以此類推。下標(biāo)不用我們?nèi)ピO(shè)置,而是集合本身根據(jù)添加進來的元素自動分配的。

有序集合

Set 無序集合

排隊是啥?不懂,往前沖就對了。沒有先后順序,沒有任何標(biāo)記,總之把對象丟進set以后,你就只知道他在里面,想要找到你需要的對象只能遍歷集合,一個個找,直到找到你想要的那個。

既然set沒有順序,找起來這么麻煩,那要set有什么用?set最大的特點就是元素不會有重復(fù)。List雖然可以保證對象有序,但是無法保證集合里面的對象都不同,而set可以保證集合里面的對象都不同。

無序集合

Map鍵值對

鍵值對,看名字就知道是一對一對的,一個key對應(yīng)一個value,通過key去查找value。

比如你跟你的男朋友,女朋友就是一對一對的,想要找到你,你的女朋友有一萬種方法,比如奪命連環(huán)call啊,微信表情轟炸啊,實在不行還有手機定位大法。map也是一樣,想要找到value,只用通過key就行,有了key就找到value了。

當(dāng)然,key是不能重復(fù)的,如果已經(jīng)存在一個key,又往map里面添加一個有相同key的鍵值對,那么原來的鍵值對會被覆蓋掉,用這個key只能查到最新的value,而不是以前的value。

鍵值對

集合與數(shù)組的區(qū)別

其實說到集合,很多同學(xué)都會想到前面說過的一個概念 - 數(shù)組。數(shù)組不是也是用來裝東西的么?那用數(shù)組不是就夠了,為什么還要用集合呢?

我們首先來回憶一下數(shù)組的定義方式。

第一種:定義的時候就要放進去元素,靜態(tài)初始化

int[] array = {1,2,3};

第二種:定義的時候要規(guī)定長度,動態(tài)初始化

int[] array = new int[3];

好了,各位發(fā)現(xiàn)問題沒有?要么定義的時候就要將數(shù)據(jù)準(zhǔn)備好,并且放進去,要么定義的時候就要規(guī)定好數(shù)組的長度。那么如果我現(xiàn)在想要一個容器來存對象,但是我既不知道對象長啥樣,也不知道有多少個對象會放進去,這時候就無法使用數(shù)組來作容器了。

這種情況下,集合的作用就體現(xiàn)出來了。我只需要定義一個集合往哪一扔就夠了,不需要知道對象長啥樣,也不管有多少對象,來多少我往里塞多少就夠了。

集合框架的結(jié)構(gòu)

集合的家族很龐大,除了上面介紹的三種常用結(jié)構(gòu)之外,還有很多結(jié)構(gòu)可以使用,下面就從集合框架的設(shè)計來逐一說明。


1

首先,不管我們定義一個什么結(jié)構(gòu)的集合,他們都有共同的特點,那就是可以將集合里面的元素一個個數(shù)出來,也就是可以遍歷。具體怎么數(shù)我不管,能數(shù)就行。是不是很自然的想到了接口?接口定標(biāo)準(zhǔn),是個集合就能一個個數(shù)元素,所以集合體系最頂層的就是一個Iterable接口。

一個集合,要能往里面放元素吧,可以刪除元素吧,對集合定義一些操作的標(biāo)準(zhǔn),這個事Collection接口干了,Collection接口繼承了Iterable接口,擁有了遍歷元素的標(biāo)準(zhǔn)。


2

繼續(xù)來細化標(biāo)準(zhǔn),有了操作元素的接口,就可以區(qū)分操作方式,比如通過下標(biāo)操作集合,就有了List接口,沒有操作下標(biāo)功能的就成了Set接口。他們都繼承于Collection接口,用于細化標(biāo)準(zhǔn)。


3

集合都可以有一些公共的操作,比如轉(zhuǎn)為數(shù)組,清空數(shù)組等操作,這時候是不是該抽象類出場了?抽象類實現(xiàn)公共方法給子類調(diào)用,但是又有部分方法需要到具體的實現(xiàn)類才能實現(xiàn),所以使用抽象類而不是直接實現(xiàn)所有接口。


4

到了這里還不能直接實現(xiàn)List和Set,因為就算是有序隊列也不止是List這一種,所以這里先安排一個抽象類來獲取集合的公共方法,方法就是繼承AbstractCollection。然后可以實現(xiàn)大部分List和Set接口的方法了,只保留了部分特殊的方法留給子類實現(xiàn),讓最后實現(xiàn)List和Set的類有不同的功能。


5

最后的常用實現(xiàn)類終于登場了,ArrayList和HashSet是最常用的List和Set接口的實現(xiàn)。通過繼承AbstractList和AbstractSet,他們獲得了抽象類的公共方法。Map也有類似的體系,這里就不具體介紹了。

從以上的體系中,我們可以看到,在做一個功能的時候,首先用接口定好標(biāo)準(zhǔn),然后再用接口來擴展標(biāo)準(zhǔn),用抽象類實現(xiàn)公共方法,再用繼承來滿足各種不同的需要形成最后使用的類。這樣來設(shè)計功能,不僅分工明確,而且靈活可變,當(dāng)需求發(fā)生變化時,可以有各種手段來擴展功能滿足新的需求。

此圖不是完整的集合框架圖,只介紹了部分常用的集合以及在集合框架中的位置。

本章帶各位大致了解了集合框架的體系結(jié)構(gòu),這對于我們后面詳細解讀常用集合非常有用。


最近連續(xù)加班和出差,更新慢了,不好意思啦各位。

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

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

  • 一、集合入門總結(jié) 集合框架: Java中的集合框架大類可分為Collection和Map;兩者的區(qū)別: 1、Col...
    程序員歐陽閱讀 11,810評論 2 61
  • Java集合類可用于存儲數(shù)量不等的對象,并可以實現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 2,081評論 0 13
  • 今年的十月一,同樣的人潮人海,你是不是同樣的吃吃喝喝、轉(zhuǎn)轉(zhuǎn)玩玩?我是 旅行于我最大的意義,在于跳脫出習(xí)慣的生活軌道...
    Dr魏閱讀 322評論 0 3
  • 讀《秘密花園》有感 廈門路小學(xué) 李欣欣 《秘密花園》是上個世紀(jì)最著名的美國女作家伯內(nèi)特的...
    小茜茜公主閱讀 477評論 0 1
  • 今天把家里樓上樓下徹底打掃干凈了,我寶寶要是在家,怎么在地上玩都不會弄臟衣服。新年新氣象,期待我的小乖乖早點回家-...
    寒江雪810閱讀 169評論 0 0

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