Java集合

一、Set和Map
Set代表一種集合元素?zé)o序咐扭、集合元素不可重復(fù)的集合华弓,Map代表一種由多個key-value對組成的集合食零,可以這么說,Map集合是Set集合的拓展寂屏。
Map和Set的關(guān)系:Map集合的Key具有一個特征:所有key不能重復(fù)贰谣,并且沒有順序,也就是說迁霎,如果將Map集合中的所有Key集中起來吱抚,那這些key就組成了一個set集合。對于map而言考廉,相當于每個元素都是key-value的Set集合秘豹。

1、HashMap和HashSet
HashSet:系統(tǒng)采用Hash算法決定集合元素的存儲位置昌粤,這樣可以保證快速存取集合元素既绕。
HashMap:系統(tǒng)將Value作為key的附屬,系統(tǒng)根據(jù)Hash算法來決定key的存儲位置涮坐,這樣可以保證快速存取集合Key凄贩,而value總是跟隨key存儲。
note:集合存放的只是對象的引用袱讹。

HashMap put步驟:
1疲扎,根據(jù)key的keyCode計算Hash值
2,搜索指定hash值在對應(yīng)table中的索引
3,如果i處索引處的Entry不為null椒丧,通過循環(huán)不斷遍歷e元素的下一個元素
4壹甥,找到指定key與需要放入的key相等,新添加Entry的value將覆蓋原有Entry的value瓜挽,但key不會覆蓋
5盹廷,如果i索引處的Entry為null征绸,表明此處還沒有Entry
6久橙,將key,value添加到i索引處
note:當系統(tǒng)決定存儲HashMap中的key-value對時管怠,完全沒有考慮Entry中的value淆衷,而僅僅只是根據(jù)key來計算并決定每個Entry的存儲位置,在key的hash如果通過equals比較兩個Entry的key發(fā)現(xiàn)相等渤弛,就會替換掉原有entry中value值祝拯,如果不相等,新添加的Entry將與原有Entry形成Entry鏈她肯。addEntry()方法佳头。

HashMap構(gòu)造器,默認初始容量為16晴氨,如果需要指定初始容量康嘉,最好指定為2的n次方。
當HashMap的每個bucket里存儲的Entry只是單個Entry籽前,即沒有通過指針產(chǎn)生Entry鏈時亭珍,此時的HashMap具有最好的性能。

負載因子:默認為0.75枝哄,增大負載因子可以減小Hash表(實際上就是Entry數(shù)組)所占用的內(nèi)存空間肄梨,但會增加查詢數(shù)據(jù)的時間開銷,減小負載因子會提高數(shù)據(jù)查詢的性能挠锥,但會增加Hash表所占用的內(nèi)存空間众羡。

HashSet是基于HashMap實現(xiàn)的,底層仍然采用HashMap來保存所有的元素蓖租。封裝了一個HashMap對象來存儲所有的集合元素粱侣。所有放入HashSet中的集合元素實際上由HashMap的key來保存,而HashMap的value則存儲了一個靜態(tài)的Object對象菜秦。因此HashSet和HashMap在實現(xiàn)本質(zhì)上是相同的甜害。

當試圖把某個類的對象當成HashMap的key,或者試圖將這個類的對象放入HashSet中保存時球昨,重寫equals方法和hashCode方法很重要尔店,而且這兩個方法的返回值必需保持一致。

2、TreeMap和TreeSet
HashSet底層依賴于HashMap實現(xiàn)嚣州,TreeSet底層則采用一個NavigableMap來保存TreeSet集合的元素鲫售,由于NavigableMap只是一個接口,因此底層仍然采用TreeMap來保存Set集合中的所有元素该肴。
TreeMap情竹,底層采用紅黑樹的排序二叉樹來保存Map中的每個Entry,每個Entry都被當成紅黑樹的一個節(jié)點來看待匀哄。

TreeMap添加元素秦效、取出元素的性能都比HashMap低,這些操作都需要通過循環(huán)找到新增Entry的插入位置涎嚼,因此比較好性能阱州,優(yōu)勢在于:TreeMap中所有的Entry總是按key根據(jù)指定排序規(guī)則保存有序狀態(tài),TreeSet中所有元素總是根據(jù)指定排序規(guī)則保持有序狀態(tài)法梯。

二苔货、Map和List
Map接口提供了get(Key)方法允許對象根據(jù)key獲取value.
List接口提供了get(int index)方法允許List對象根據(jù)元素索引來取得value.

List相當于所有key都是int類型的Map,也可以說Map相當于索引是任意類型的List.

ArrayList和LinkedList
List三個主要實現(xiàn)類:ArrayList、Vector立哑、LinkedList
Vector還有一個Stack子類夜惭,僅在Vector的基礎(chǔ)上增加了5個方法,Stack和Vector都是線程安全的類铛绰。
在無需保證線程安全的情況下诈茧,推薦使用ArrayDeque來代替Stack類。
Deque代表雙端隊列這種數(shù)據(jù)結(jié)構(gòu)至耻,他既有隊列的先進先出性質(zhì)若皱,也具有棧的性質(zhì),既是隊列尘颓,也是棧走触。
ArrayList和ArrayDeque底層都是基于數(shù)組實現(xiàn)的,只是所提供的方法不同疤苹。

Vector和ArrayList的區(qū)別
1互广,Vector和ArrayList都繼承自List,底層都是基于數(shù)組卧土,但是ArrayList使用transient修飾底層數(shù)組惫皱,保證序列化ArrayList對象的時候不會直接序列化底層數(shù)組,而是通過writeObject和readObject來實現(xiàn)定制序列化尤莺,Vector沒有實現(xiàn)旅敷。
因此ArrayList比Vector的序列化實現(xiàn)更安全。
2颤霎,Vector是線程安全的媳谁,ArrayList不是涂滴。
3,數(shù)組擴充:
ArrayList:int newCapacity = (oldCapacity3)/2+1 //將新容量擴充為原來的1.5倍
Vector:int newCapacity = (capacityIncrement>0)?(oldCapacity+capacityIncrement):(oldCapacity
2); //如果capacityIncrement>0晴音,新容量 = oldCapacity+capacityIncrement柔纵,否則擴充為原來的兩倍。

ArrayList和LinkedList的實現(xiàn)差異
1锤躁,List代表一種線性表的數(shù)據(jù)結(jié)構(gòu)搁料,ArrayList則是一種順序存儲的線性表。
2系羞,ArrayList底層采用數(shù)組來存儲每個集合元素郭计。LinkedList是一種鏈式存儲的線性表。其本質(zhì)上是一個雙向鏈表觉啊,不僅實現(xiàn)了List接口拣宏,還實現(xiàn)了Deque接口沈贝。也就是說LinkedList不僅可以當成雙向鏈表使用杠人,還可以當成棧來使用,還可以當成隊列來使用宋下。
3嗡善,ArrayList添加、刪除集合元素時学歧,ArrayList底層都需要對數(shù)組進行“整體搬家”罩引,性能非常差。

ArrayList和LinkedList的性能分析和使用場景
1枝笨,當程序需要以get(int index)方法獲取指定索引處的元素時袁铐,ArrayList>LinkedList,
2,當程序調(diào)用add(int index,Object obj)向List集合添加元素時横浑,ArrayList需要對底層數(shù)組元素進行整體搬家剔桨,如果添加元素導(dǎo)致集合長度將要超過底層數(shù)組長度,ArrayList必須新建一個長度為原來長度1.5倍的數(shù)組徙融,再有垃圾回收機制回收原有數(shù)組洒缀,系統(tǒng)開銷較大。對于LinkedList而言欺冀,他的開銷主要集中在根據(jù)index找到元素的過程树绩,即使如此:LinkedList>ArrayList
3,當程序調(diào)用remove(int index)方法刪除index處的元素時隐轩,ArrayList同樣需要對底層數(shù)組元素進行整體搬家饺饭,但是無需考慮創(chuàng)建新的數(shù)組,因此:LinkedList約等于ArrayList
4职车,當程序調(diào)用add(Object obj)時瘫俊,大多數(shù)時候無需對數(shù)組進行整體搬家蛛芥,但是如果添加元素導(dǎo)致集合大小大于數(shù)組大小,ArrayList必須新建一個長度為原來長度1.5倍的數(shù)組军援,這樣開銷就比較大了仅淑,LinkedList則有比較好的性能。因此:LinkedList>ArrayList

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胸哥,一起剝皮案震驚了整個濱河市涯竟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌空厌,老刑警劉巖庐船,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘲更,居然都是意外死亡筐钟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門赋朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篓冲,“玉大人,你說我怎么就攤上這事宠哄∫冀” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵毛嫉,是天一觀的道長诽俯。 經(jīng)常有香客問我,道長承粤,這世上最難降的妖魔是什么暴区? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮辛臊,結(jié)果婚禮上仙粱,老公的妹妹穿的比我還像新娘。我一直安慰自己浪讳,他們只是感情好缰盏,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淹遵,像睡著了一般口猜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上透揣,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天济炎,我揣著相機與錄音,去河邊找鬼辐真。 笑死须尚,一個胖子當著我的面吹牛崖堤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耐床,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼密幔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撩轰?” 一聲冷哼從身側(cè)響起胯甩,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堪嫂,沒想到半個月后偎箫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡皆串,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年淹办,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恶复。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡怜森,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寂玲,到底是詐尸還是另有隱情塔插,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布拓哟,位于F島的核電站,受9級特大地震影響伶授,放射性物質(zhì)發(fā)生泄漏断序。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一糜烹、第九天 我趴在偏房一處隱蔽的房頂上張望违诗。 院中可真熱鬧,春花似錦疮蹦、人聲如沸诸迟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阵苇。三九已至,卻和暖如春感论,著一層夾襖步出監(jiān)牢的瞬間绅项,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工比肄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留快耿,地道東北人囊陡。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像掀亥,于是被迫代替她去往敵國和親撞反。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容