java集合框架簡介

集合框架圖

集合框架圖
Collection與Map內(nèi)部詳細(xì)

Java集合框架主要包括兩種類型的容器款咖,一種是集合(Collection)何暮,存儲(chǔ)一個(gè)元素集合海洼,另一種是圖(Map),存儲(chǔ)鍵/值對映射坏逢。Collection接口又有3種子類型,List是整、Set和Queue民假,再下面是一些抽象類,最后是具體實(shí)現(xiàn)類阳欲,常用的有ArrayList陋率、LinkedList、HashSet瓦糟、LinkedHashSet、HashMap菩浙、LinkedHashMap等等。

Collection接口

Collection接口是處理對象集合的根接口劲蜻,其中定義了很多對元素進(jìn)行操作的方法,AbstractCollection是提供Collection部分實(shí)現(xiàn)的抽象類先嬉。

Collection接口里面定義的方法

  • size(): int
  • isEmpty: boolean
  • contains(Object): bollean
  • iterator(): Iterator<E>
  • toArray(): Object[]
  • toArray(T[])<T>: T[]
  • add(E): boolean
  • remove(Object) : boolean
  • containsAll(Collection<?> ): boolean
  • removeAll(Collection<?>): boolean
  • removeIf(Predicate<? super E >): boolean
  • retainAll(Collection<?>):boolean
  • clear(): void
  • equals(Object) : boolean
  • hashCCode(): int
  • spliterator(): Spliterator<E>
  • stream(): Stream<E>
  • parallelStream(): Steam<E>

List接口

List可以定義一個(gè)允許重復(fù)的有序集合,List接口主要是增加了面向位置的操作含懊,允許在指定位置上操作元素,同時(shí)增加了一個(gè)能夠雙向遍歷線性表的新列表迭代器ListIterator岔乔。AbstractList類提供了List接口的部分實(shí)現(xiàn)滚躯,AbstractSequentialList擴(kuò)展自AbstractList嘿歌,主要是提供對鏈表的支持茁影。可能最常用的類呼胚,ArrayList和LinkedList

  • ArrayList
    用動(dòng)態(tài)數(shù)組存儲(chǔ)元素,這個(gè)數(shù)組可以動(dòng)態(tài)創(chuàng)建蝇更,如果元素個(gè)數(shù)超過了數(shù)組的容量,那么就創(chuàng)建一個(gè)更大的新數(shù)組年扩,并將當(dāng)前數(shù)組中的所有元素都復(fù)制到新數(shù)組中。

  • LinkedList
    LinkedList是在一個(gè)鏈表中存儲(chǔ)元素厨幻。

  • ArrayList與LinkedList的差異
    若只對單條數(shù)據(jù)插入或刪除,ArrayList的速度反而優(yōu)于LinkedList饭宾。但若是批量隨機(jī)的插入刪除數(shù)據(jù),LinkedList的速度大大優(yōu)于ArrayList. 因?yàn)锳rrayList每插入一條數(shù)據(jù)看铆,要移動(dòng)插入點(diǎn)及之后的所有數(shù)據(jù)盛末。
    對于隨機(jī)訪問get和set,ArrayList覺得優(yōu)于LinkedList悄但,因?yàn)長inkedList要移動(dòng)指針。查找操作indexOf,lastIndexOf,contains等檐嚣,兩者差不多。
    ArrayList線程不安全净嘀,查詢塊,因?yàn)槭菙?shù)組來構(gòu)成的挖藏。

Set接口

Set接口擴(kuò)展自Collection,它與List的不同之處在于岩臣,規(guī)定Set的實(shí)例不包含重復(fù)的元素溜嗜。在一個(gè)規(guī)則集內(nèi)架谎,一定不存在兩個(gè)相等的元素。AbstractSet是一個(gè)實(shí)現(xiàn)Set接口的抽象類土全,Set接口有三個(gè)具體實(shí)現(xiàn)類,分別是散列集HashSet裹匙、鏈?zhǔn)缴⒘屑疞inkedHashSet和樹形集TreeSet。

  • HashSet散列集
    散列集HashSet是一個(gè)用于實(shí)現(xiàn)Set接口的具體類概页,可以使用它的無參構(gòu)造方法來創(chuàng)建空的散列集练慕,也可以由一個(gè)現(xiàn)有的集合創(chuàng)建散列集。在散列集中铃将,有兩個(gè)名詞需要關(guān)注,初始容量和客座率麸塞〗а茫客座率是確定在增加規(guī)則集之前,該規(guī)則集的飽滿程度弧哎,當(dāng)元素個(gè)數(shù)超過了容量與客座率的乘積時(shí),容量就會(huì)自動(dòng)翻倍撤嫩。輸出的時(shí)候是無序的,跟add()添加元素的順序無關(guān)序攘。

  • LinkedHashSet鏈?zhǔn)缴⒘屑?br> LinkedHashSet是用一個(gè)鏈表實(shí)現(xiàn)來擴(kuò)展HashSet類,它支持對規(guī)則集內(nèi)的元素排序程奠。HashSet中的元素是沒有被排序的,而LinkedHashSet中的元素可以按照它們插入規(guī)則集的順序提取瞄沙。

  • TreeSet樹形集
    TreeSet擴(kuò)展自AbstractSet慌核,并實(shí)現(xiàn)了NavigableSet申尼,AbstractSet擴(kuò)展自AbstractCollection,樹形集是一個(gè)有序的Set师幕,其底層是一顆樹,這樣就能從Set里面提取一個(gè)有序序列了霹粥。在實(shí)例化TreeSet時(shí),我們可以給TreeSet指定一個(gè)比較器Comparator來指定樹形集中的元素順序宗侦。

Queue接口

隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊(duì)列末尾添加矾利,在隊(duì)列頭部刪除。Queue接口擴(kuò)展自Collection男旗,并提供插入、提取察皇、檢驗(yàn)等操作泽台。

Queue接口方法

  • add(E):
    增加一個(gè)元索,如果隊(duì)列已滿,則拋出一個(gè)IIIegaISlabEepeplian異常
  • offer(E):bolean
    添加一個(gè)元素并返回true,如果隊(duì)列已滿怀酷,則返回false
  • poll(): E
    移除并返問隊(duì)列頭部的元素,如果隊(duì)列為空,則返回null
  • remove(): E
    移除并返回隊(duì)列頭部的元素,如果隊(duì)列為空蜕依,則拋出一個(gè)NoSuchElementException異常
  • peek(): E
    返回隊(duì)列頭部的元素,如果隊(duì)列為空,則返回null
  • element(): E
    返回隊(duì)列頭部的元素,如果隊(duì)列為空样眠,則拋出一個(gè)NoSuchElementException異常

接口Deque,是一個(gè)擴(kuò)展自Queue的雙端隊(duì)列辫秧,它支持在兩端插入和刪除元素,因?yàn)長inkedList類實(shí)現(xiàn)了Deque接口茶没,所以通常我們可以使用LinkedList來創(chuàng)建一個(gè)隊(duì)列肌幽。PriorityQueue類實(shí)現(xiàn)了一個(gè)優(yōu)先隊(duì)列抓半,優(yōu)先隊(duì)列中元素被賦予優(yōu)先級(jí),擁有高優(yōu)先級(jí)的先被刪除笛求。

Map接口

Map是一種存儲(chǔ)鍵值對映射的容器類,在Map中鍵可以
任意類型的對象狡孔,但不能有重復(fù)的鍵,每個(gè)鍵都對應(yīng)一個(gè)值苗膝,真正存儲(chǔ)在圖中的是鍵值構(gòu)成的條目。

  • Map存儲(chǔ)元素使用put方法辱揭,Collection使用add方法
  • Map集合沒有直接取出元素的方法,而是先轉(zhuǎn)成Set集合问窃,在通過迭代獲取元素
  • Map集合中鍵要保證唯一性

HashMap

HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)完沪,繼承自AbstractMap,AbstractMap是部分實(shí)現(xiàn)Map接口的抽象類覆积。JDK1.8中,HashMap采用數(shù)組+鏈表+紅黑樹實(shí)現(xiàn)技健,當(dāng)鏈表長度超過閾值(8)時(shí),將鏈表轉(zhuǎn)換為紅黑樹雌贱,這樣大大減少了查找時(shí)間欣孤。
HashMap:線程不安全,速度快降传,允許存放null鍵。

關(guān)于HashMap與HashTable

相同:他們都是集合類婆排,用來存放java對象声旺。

區(qū)別:

  1. 歷史原因
    Hashtable是基于陳舊的Dictionary類的腮猖,HashMap是jdk1.2之后引入的一個(gè)基于Map接口的一個(gè)實(shí)現(xiàn)。
  2. 同步性
    Hashtable是線程同步的澈缺,而HashMap不是,他是異步的姐赡。因而Hashtable是線程安全的,HashMap非線程安全项滑。當(dāng)然因?yàn)榫€程安全涯贞,所以執(zhí)行效率低,HashMap非線程安全則執(zhí)行效率高肩狂,速度快。(如:多個(gè)線程去同時(shí)請求一個(gè)程序(如服務(wù)器)傻谁,則如果是線程安全則會(huì)用到鎖的概念,在程序響應(yīng)一個(gè)線程的時(shí)候會(huì)將該程序鎖定审磁,讓其他過來響應(yīng)的線程等待,并且是按序等待态蒂,所以他是安全的,不會(huì)造成程序崩潰)钾恢。如果不用到線程安全,則應(yīng)該首選HaspMap泉懦,這樣運(yùn)行效率會(huì)高一些。

  3. HaspMap可以將空值null作為key或者value崩哩。但Hashtable是不能的。
  4. 方法
    HashMap把Hashtable的contains方法去掉了邓嘹,改成containsvalue和containsKey;因?yàn)閏ontains方法容易讓人引起誤解汹押。

LinkedMap

LinkedHashMap繼承自HashMap,它主要是用鏈表實(shí)現(xiàn)來擴(kuò)展HashMap類鲸阻,HashMap中條目是沒有順序的,但是在LinkedHashMap中元素既可以按照它們插入圖的順序排序鸟悴,也可以按它們最后一次被訪問的順序排序。

TreeMap

TreeMap基于紅黑樹數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)沛贪,鍵值可以使用Comparable或Comparator接口來排序。TreeMap繼承自AbstractMap利赋,同時(shí)實(shí)現(xiàn)了接口NavigableMap,而接口NavigableMap則繼承自SortedMap媚送。SortedMap是Map的子接口,使用它可以確保圖中的條目是排好序的塘偎。

在實(shí)際使用中,如果更新圖時(shí)不需要保持圖中元素的順序吟秩,就使用HashMap绽淘,如果需要保持圖中元素的插入順序或者訪問順序,就使用LinkedHashMap沪铭,如果需要使圖按照鍵值排序,就使用TreeMap伦意。

Iterator迭代器

迭代器是一種設(shè)計(jì)模式,它是一個(gè)對象驮肉,它可以遍歷并選擇序列中的對象已骇,而開發(fā)人員不需要了解該序列的底層結(jié)構(gòu)票编。迭代器通常被稱為“輕量級(jí)”對象卵渴,因?yàn)閯?chuàng)建它的代價(jià)小。并且只能單向移動(dòng)

迭代器可用與Collection框架內(nèi)的所有類型的集合浪读,由圖可以看出Collection是繼承了Iterator的。

  • 為什么要用迭代器
    一方面碘橘,迭代器的開銷開銷比較小,在訪問集合對象時(shí)候能節(jié)省內(nèi)存
    另一方面仰禽,通過for循環(huán)來訪問集合對象的時(shí)候,不能對集合對象進(jìn)行刪操作吐葵,而迭代器可以。

Iterarot與ListIterator不同

  1. 使用范圍不同温峭,Iterator可以應(yīng)用于所有的集合,Set凤藏、List和Map和這些集合的子類型。而ListIterator只能用于List及其子類型清笨。
  2. ListIterator有add方法刃跛,可以向List中添加對象,而Iterator不能桨昙。
  3. ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷蛙酪,但是ListIterator有hasPrevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷桂塞。Iterator不可以。
  4. ListIterator可以定位當(dāng)前索引的位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)汰瘫。Iterator沒有此功能。
  5. 都可實(shí)現(xiàn)刪除操作混弥,但是ListIterator可以實(shí)現(xiàn)對象的修改,set()方法可以實(shí)現(xiàn)蝗拿。Iterator僅能遍歷,不能修改哀托。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末同仆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俗批,更是在濱河造成了極大的恐慌,老刑警劉巖岁忘,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異帅腌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)速客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門五鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人位喂,你說我怎么就攤上這事∷苎拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵规婆,是天一觀的道長蝉稳。 經(jīng)常有香客問我苗踪,道長削锰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任器贩,我火速辦了婚禮,結(jié)果婚禮上蛹稍,老公的妹妹穿的比我還像新娘。我一直安慰自己唆姐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布奉芦。 她就那樣靜靜地躺著,像睡著了一般声功。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上先巴,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音摩渺,去河邊找鬼。 笑死摇幻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的囚企。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼龙宏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了银酗?” 一聲冷哼從身側(cè)響起辆影,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤蛙讥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后次慢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迫像,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瞳遍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掠械。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖均唉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浸卦,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布限嫌,位于F島的核電站,受9級(jí)特大地震影響怒医,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜稚叹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一拿诸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亩码,春花似錦季率、人聲如沸飒泻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至史辙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間髓霞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來泰國打工方库, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纵潦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓邀层,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寥院。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

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

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 869評(píng)論 0 1
  • 概述 Java集合框架由Java類庫的一系列接口秸谢、抽象類以及具體實(shí)現(xiàn)類組成霹肝。我們這里所說的集合就是把一組對象組織到...
    absfree閱讀 1,246評(píng)論 0 10
  • title: java集合框架學(xué)習(xí)總結(jié) tags:集合框架 categories:總結(jié) date: 2017-03...
    行徑行閱讀 1,675評(píng)論 0 2
  • 1.Java集合框架是什么?說出一些集合框架的優(yōu)點(diǎn)臭蚁? 每種編程語言中都有集合,最初的Java版本包含幾種集合類:V...
    Oneisall_81a5閱讀 898評(píng)論 0 11
  • 稿酬所得垮兑,是指個(gè)人因其作品以圖書、報(bào)刊形式出版系枪、發(fā)表而取得的所得。不以圖書识樱、報(bào)刊形式出版震束、發(fā)表的翻譯当犯、審稿、書畫所...
    51簡記閱讀 1,251評(píng)論 0 0