[java 基礎(chǔ)] 集合

在集合家族中康栈,有我們常用的有List递递、Set系瓢、Map抖锥,也有不常用的Stack、Queue凄杯,有線程安全的Vector悬荣、HashTable菠秒,也有非線程安全的LinkedList、HashMap等隅熙。下圖是集合家族的全家福稽煤。

collection.png

從圖中可以看出來(lái)核芽,集合一共分兩類,一類是Collection酵熙,一類是Map轧简,而Collection下又分為Set、List匾二、Queue哮独。

Collection

Collection接口是最基本的集合接口,它不提供直接的實(shí)現(xiàn)察藐,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set皮璧。Collection所代表的是一種規(guī)則,它所包含的元素都必須遵循一條或者多條規(guī)則分飞。如有些允許重復(fù)而有些則不能重復(fù)悴务、有些必須要按照順序插入而有些則是散列,有些支持排序但是有些則不支持譬猫。
在Java中所有實(shí)現(xiàn)了Collection接口的類都必須提供兩套標(biāo)準(zhǔn)的構(gòu)造函數(shù)讯檐,一個(gè)是無(wú)參,用于創(chuàng)建一個(gè)空的Collection染服,一個(gè)是帶有Collection參數(shù)的有參構(gòu)造函數(shù)别洪,用于創(chuàng)建一個(gè)新的Collection,這個(gè)新的Collection與傳入進(jìn)來(lái)的Collection具備相同的元素柳刮。

List

List接口為Collection直接接口挖垛。List所代表的是有序的Collection,即它用某種特定的插入順序來(lái)維護(hù)元素順序秉颗。用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制痢毒,同時(shí)可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素站宗。實(shí)現(xiàn)List接口的集合主要有:ArrayList闸准、LinkedList益愈、Vector梢灭、Stack。

  • ArrayList
    ArrayList是一個(gè)動(dòng)態(tài)數(shù)組蒸其,也是我們最常用的集合敏释。它允許任何符合規(guī)則的元素插入甚至包括null。每一個(gè)ArrayList都有一個(gè)初始容量(10)摸袁,該容量代表了數(shù)組的大小钥顽。隨著容器中的元素不斷增加,容器的大小也會(huì)隨著增加靠汁。在每次向容器中增加元素的同時(shí)都會(huì)進(jìn)行容量檢查蜂大,當(dāng)快溢出時(shí)闽铐,就會(huì)進(jìn)行擴(kuò)容操作。所以如果我們明確所插入元素的多少奶浦,最好指定一個(gè)初始容量值兄墅,避免過多的進(jìn)行擴(kuò)容操作而浪費(fèi)時(shí)間、效率澳叉。
    size隙咸、isEmpty、get成洗、set五督、iterator 和 listIterator 操作都以固定時(shí)間運(yùn)行。add 操作以分?jǐn)偟墓潭〞r(shí)間運(yùn)行瓶殃,也就是說(shuō)充包,添加 n 個(gè)元素需要 O(n) 時(shí)間(由于要考慮到擴(kuò)容,所以這不只是添加元素會(huì)帶來(lái)分?jǐn)偣潭〞r(shí)間開銷那樣簡(jiǎn)單)遥椿。
    ArrayList實(shí)現(xiàn)了RandomAccess接口误证,支持于隨機(jī)訪問。同時(shí)ArrayList是非線程安全的修壕。
  • LinkedList
    同樣實(shí)現(xiàn)List接口的LinkedList與ArrayList不同愈捅,ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,而LinkedList是一個(gè)雙向鏈表慈鸠。所以它除了有ArrayList的基本操作方法外還額外提供了get蓝谨,remove,insert方法在LinkedList的首部或尾部青团。
    由于實(shí)現(xiàn)的方式不同譬巫,LinkedList不能隨機(jī)訪問,它所有的操作都是要按照雙重鏈表的需要執(zhí)行督笆。在列表中索引的操作將從開頭或結(jié)尾遍歷列表(從靠近指定索引的一端)芦昔。這樣做的好處就是可以通過較低的代價(jià)在List中進(jìn)行插入和刪除操作。
    與ArrayList一樣娃肿,LinkedList也是非同步的咕缎。如果多個(gè)線程同時(shí)訪問一個(gè)List,則必須自己實(shí)現(xiàn)訪問同步料扰。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List: List list = Collections.synchronizedList(new LinkedList(...));
  • Vector
    與ArrayList相似凭豪,但是Vector是同步的。所以說(shuō)Vector是線程安全的動(dòng)態(tài)數(shù)組晒杈。它的操作與ArrayList幾乎一樣嫂伞。
  • Stack
    Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用帖努∽颍基本的push和pop 方法,還有peek方法得到棧頂?shù)脑仄从啵琫mpty方法測(cè)試堆棧是否為空郑趁,search方法檢測(cè)一個(gè)元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧姿搜。

Set接口

Set是一種不包括重復(fù)元素的Collection寡润。它維持它自己的內(nèi)部排序,所以隨機(jī)訪問沒有任何意義舅柜。與List一樣梭纹,它同樣運(yùn)行null的存在但是僅有一個(gè)。由于Set接口的特殊性致份,所有傳入Set集合中的元素都必須不同变抽,同時(shí)要注意任何可變對(duì)象,如果在對(duì)集合中元素進(jìn)行操作時(shí)氮块,導(dǎo)致e1.equals(e2)==true绍载,則必定會(huì)產(chǎn)生某些問題。實(shí)現(xiàn)了Set接口的集合有:EnumSet滔蝉、HashSet击儡、TreeSet。

EnumSet

是枚舉的專用Set蝠引。所有的元素都是枚舉類型阳谍。

  • HashSet
    HashSet堪稱查詢速度最快的集合,因?yàn)槠鋬?nèi)部是以HashCode來(lái)實(shí)現(xiàn)的螃概。它內(nèi)部元素的順序是由哈希碼來(lái)決定的矫夯,所以它不保證set 的迭代順序;特別是它不保證該順序恒久不變吊洼。
  • TreeSet
    基于TreeMap训貌,生成一個(gè)總是處于排序狀態(tài)的set,內(nèi)部以TreeMap來(lái)實(shí)現(xiàn)冒窍。它是使用元素的自然順序?qū)υ剡M(jìn)行排序递沪,或者根據(jù)創(chuàng)建Set 時(shí)提供的Comparator
    進(jìn)行排序,具體取決于使用的構(gòu)造方法超燃。

Queue

隊(duì)列区拳,它主要分為兩大類拘领,一類是阻塞式隊(duì)列意乓,隊(duì)列滿了以后再插入元素則會(huì)拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue届良、LinkedBlockingQueue笆凌。另一種隊(duì)列則是雙端隊(duì)列,支持在頭士葫、尾兩端插入和移除元素乞而,主要包括:ArrayDeque、LinkedBlockingDeque慢显、LinkedList爪模。

Deque

雙向隊(duì)列(Deque),是Queue的一個(gè)子接口,雙向隊(duì)列是指該隊(duì)列兩端的元素既能入隊(duì)(offer)也能出隊(duì)(poll),如果將Deque限制為只能從一端入隊(duì)和出隊(duì)荚藻,則可實(shí)現(xiàn)棧的數(shù)據(jù)結(jié)構(gòu)屋灌。對(duì)于棧而言,有入棧(push)和出棧(pop)应狱,遵循先進(jìn)后出原則

Map接口

Map與List共郭、Set接口不同,它是由一系列鍵值對(duì)組成的集合疾呻,提供了key到Value的映射除嘹。同時(shí)它也沒有繼承Collection。在Map中它保證了key與value之間的一一對(duì)應(yīng)關(guān)系岸蜗。也就是說(shuō)一個(gè)key對(duì)應(yīng)一個(gè)value尉咕,所以它不能存在相同的key值,當(dāng)然value值可以相同璃岳。實(shí)現(xiàn)map的有:HashMap龙考、TreeMap、HashTable矾睦、Properties晦款、EnumMap。

  • HashMap
    以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)枚冗,查找對(duì)象時(shí)通過哈希函數(shù)計(jì)算其位置缓溅,它是為快速查詢而設(shè)計(jì)的,其內(nèi)部定義了一個(gè)hash表數(shù)組(Entry[] table)赁温,元素會(huì)通過哈希轉(zhuǎn)換函數(shù)將元素的哈希地址轉(zhuǎn)換成數(shù)組中存放的索引坛怪,如果有沖突,則使用散列鏈表的形式將所有相同哈希地址的元素串起來(lái)股囊,可能通過查看HashMap.Entry的源碼它是一個(gè)單鏈表結(jié)構(gòu)袜匿。
  • WeakHashMap類
    WeakHashMap是一種改進(jìn)的HashMap,它對(duì)key實(shí)行“弱引用”稚疹,如果一個(gè)key不再被外部所引用居灯,那么該key可以被GC回收。
  • TreeMap
    鍵以某種排序規(guī)則排序,內(nèi)部以red-black(紅-黑)樹數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)怪嫌,實(shí)現(xiàn)了SortedMap接口
  • HashTable
    也是以哈希表數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的义锥,解決沖突時(shí)與HashMap也一樣也是采用了散列鏈表的形式,不過性能比HashMap要低
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩灭,一起剝皮案震驚了整個(gè)濱河市拌倍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌噪径,老刑警劉巖柱恤,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異找爱,居然都是意外死亡膨更,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門缴允,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荚守,“玉大人,你說(shuō)我怎么就攤上這事练般〈Q” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵薄料,是天一觀的道長(zhǎng)敞贡。 經(jīng)常有香客問我,道長(zhǎng)摄职,這世上最難降的妖魔是什么誊役? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮谷市,結(jié)果婚禮上蛔垢,老公的妹妹穿的比我還像新娘。我一直安慰自己迫悠,他們只是感情好鹏漆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著创泄,像睡著了一般艺玲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞠抑,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天饭聚,我揣著相機(jī)與錄音,去河邊找鬼搁拙。 笑死秒梳,一個(gè)胖子當(dāng)著我的面吹牛法绵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播端幼,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼礼烈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弧满!你這毒婦竟也來(lái)了婆跑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庭呜,失蹤者是張志新(化名)和其女友劉穎滑进,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體募谎,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扶关,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了数冬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片节槐。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拐纱,靈堂內(nèi)的尸體忽然破棺而出铜异,到底是詐尸還是另有隱情,我是刑警寧澤秸架,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布揍庄,位于F島的核電站,受9級(jí)特大地震影響东抹,放射性物質(zhì)發(fā)生泄漏蚂子。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一缭黔、第九天 我趴在偏房一處隱蔽的房頂上張望食茎。 院中可真熱鬧,春花似錦馏谨、人聲如沸董瞻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钠糊。三九已至,卻和暖如春壹哺,著一層夾襖步出監(jiān)牢的瞬間抄伍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工管宵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留截珍,地道東北人攀甚。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像岗喉,于是被迫代替她去往敵國(guó)和親秋度。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 集合類簡(jiǎn)介 為什么出現(xiàn)集合類事期?面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式,所以為了方便對(duì)多個(gè)對(duì)象的操作纸颜,就要對(duì)對(duì)象進(jìn)...
    阿敏其人閱讀 1,417評(píng)論 0 7
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 877評(píng)論 0 1
  • 堅(jiān)持有空就寫點(diǎn)東西兽泣,算是回顧復(fù)習(xí)。 Java集合框架下大致可以分為如下五個(gè)部分:List列表胁孙、Set集合唠倦、Map映...
    鋒Plus閱讀 291評(píng)論 0 1
  • Java類中集合的關(guān)系圖 1. 集合類概述 1.1 為什么出現(xiàn)集合類? 面向?qū)ο笳Z(yǔ)言對(duì)事物的體現(xiàn)都是以對(duì)象的形式涮较,...
    JackChen1024閱讀 438評(píng)論 0 4
  • 上一章 下午原本準(zhǔn)備繼續(xù)休息的王晉硬是被陸亦風(fēng)拖去上班了稠鼻,所以家里除了杉媽就剩林思凡自己了。午睡過后法希,無(wú)所事事的她...
    狐貍九閱讀 412評(píng)論 0 3