Java集合框架

一、什么是集合

集合是Java提供的儲(chǔ)存數(shù)據(jù)的一種容器贞让,長(zhǎng)度不限美澳,類型不限雨膨。

Java提供的關(guān)于集合的類和接口都在java.util包里面。

二、集合框架概覽

Java集合挟阻,也叫做容器坷备,由一組接口俯在、抽象類肥败、實(shí)現(xiàn)類構(gòu)成纽谒。主要由兩大接口派生而來(lái)请祖,分別是Collection接口和Map接口,Collection接口存儲(chǔ)單列元素,Map接口存儲(chǔ)雙列元素。


NmIRDbpWqUvJOAr.png

可以清楚的看到纺铭,

  • Collection接口下有三個(gè)子接口竟纳,分別是:

    • Queue接口
    • List接口
    • Set接口
  • Map接口

集合里面有一個(gè)重要的接口缘挑,叫做Iterator迭代器接口,用于迭代集合中的元素。

將上圖的接口和實(shí)現(xiàn)類保留巴帮,重新整理用押,得到新圖為:


java-collection-hierarchy.77b66a51.png

在這個(gè)圖里座掘,都是重要的類和接口。

List, Set, Queue, Map 四者的區(qū)別:

  • List :存儲(chǔ)的順序是有序的捷凄,內(nèi)容是可以重復(fù)的航唆。
  • Set :存儲(chǔ)的順序是無(wú)序的,內(nèi)容是不可以重復(fù)的剑按。
  • Queue:存儲(chǔ)的順序是有序的姑荷,內(nèi)容是可以重復(fù)的,隊(duì)列是按照先進(jìn)先出的順序的趋厉。
  • Map :Map通過鍵值對(duì)的方式來(lái)存儲(chǔ)椭蹄。key是無(wú)序的,不重復(fù)。value是無(wú)序的扎筒,可以重復(fù)层亿。

三洞慎、Collection接口

Collection接口雖然繼承了Iterable接口花椭,但是集合的最頂層依然是Collection接口沪曙,而非Iterable接口巷懈,因?yàn)镮terable接口并不規(guī)范數(shù)據(jù)的存儲(chǔ)频伤,而只是規(guī)范了集合元素的迭代。

既然Collection接口是集合中的頂層接口憋肖,那么它中定義的所有功能子類都可以使用惠爽。Collection 是層次結(jié)構(gòu)中的根接口较性。Collection 表示一組對(duì)象,這些對(duì)象也稱為 collection 的元素。一些 collection 允許有重復(fù)的元素碰凶,而另一些則不允許河胎。一些 collection 是有序的其徙,而另一些則是無(wú)序的胚迫。

Collection collection = new ArrayList();
//往集合里面添加元素
collection.add("智多星");
collection.add("浪里白條");
collection.add("豹子頭");
collection.add("花和尚")
//輸出集合中的元素
System.out.println("輸出集合中的元素"+collection);
//從集合中刪除元素 remove()
collection.remove("花和尚");
//判斷集合中是否含有指定元素 contains()
System.out.println("是否含有豹子頭"+collection.contains("豹子頭"));
//獲取集合中的元素個(gè)數(shù) size()
System.out.println("集合中的元素個(gè)數(shù)"+collection.size());
// 返回包含集合中所有元素的數(shù)組 toArray()
Object[] array = collection.toArray();
System.out.println("集合轉(zhuǎn)換為數(shù)組"+ Arrays.toString(array));
 //清除集合元素 clear()
collection.clear();
System.out.println("集合清除后:"+collection);

運(yùn)行的結(jié)果為:

輸出集合中的元素:[智多星, 浪里白條, 豹子頭, 花和尚]
刪除了元素后:[智多星, 浪里白條, 豹子頭]
是否含有豹子頭:true
集合中的元素個(gè)數(shù):3
集合轉(zhuǎn)換為數(shù)組:[智多星, 浪里白條, 豹子頭]
集合清除后:[]

四、List接口

掌握了Collection接口的使用后唾那,再來(lái)看看Collection接口中的子類

4.1 List接口介紹:

List是有序的 Collection(也稱為序列)访锻。此接口的用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素闹获,并搜索列表中的元素期犬。與 set 不同,列表通常允許重復(fù)的元素避诽。

List接口的特點(diǎn):

  • 它是一個(gè)元素存取有序的集合龟虎。例如,存元素的順序是11沙庐、22鲤妥、33佳吞,那么集合中元素的存儲(chǔ)就是按照11、22旭斥、33的順序完成的容达。
  • 它是一個(gè)帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數(shù)組的索引是一個(gè)道理)垂券。
  • 集合中可以有重復(fù)的元素花盐,通過元素的equals方法,來(lái)比較是否為重復(fù)的元素菇爪。

List接口的常用子類有:

  • ArrayList集合
  • LinkedList集合
  • Vector集合

4.2 List接口常用方法

Modifier and Type Method and Description
boolean add(E e) 將指定的元素追加到此列表的末尾(可選操作)算芯。
void add(int index, E element) 將指定的元素插入此列表中的指定位置(可選操作)。
boolean addAll(Collection<? extends E> c) 按指定集合的迭代器(可選操作)返回的順序?qū)⒅付现械乃性馗郊拥酱肆斜淼哪┪病?/td>
boolean addAll(int index, Collection<? extends E> c) 將指定集合中的所有元素插入到此列表中的指定位置(可選操作)凳宙。
void clear() 從此列表中刪除所有元素(可選操作)熙揍。
boolean contains(Object o) 如果此列表包含指定的元素,則返回 true 氏涩。
boolean containsAll(Collection<?> c) 如果此列表包含指定 集合的所有元素届囚,則返回true。
boolean equals(Object o) 將指定的對(duì)象與此列表進(jìn)行比較以獲得相等性是尖。
E get(int index) 返回此列表中指定位置的元素意系。
int hashCode() 返回此列表的哈希碼值。
int indexOf(Object o) 返回此列表中指定元素的第一次出現(xiàn)的索引饺汹,如果此列表不包含元素蛔添,則返回-1。
boolean isEmpty() 如果此列表不包含元素兜辞,則返回 true 迎瞧。
Iterator<E> iterator() 以正確的順序返回該列表中的元素的迭代器。
int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出現(xiàn)的索引逸吵,如果此列表不包含元素凶硅,則返回-1。
E remove(int index) 刪除該列表中指定位置的元素(可選操作)扫皱。
boolean remove(Object o) 從列表中刪除指定元素的第一個(gè)出現(xiàn)(如果存在)(可選操作)咏尝。
boolean removeAll(Collection<?> c) 從此列表中刪除包含在指定集合中的所有元素(可選操作)。
default void replaceAll(UnaryOperator<E> operator) 將該列表的每個(gè)元素替換為將該運(yùn)算符應(yīng)用于該元素的結(jié)果啸罢。
E set(int index, E element) 用指定的元素(可選操作)替換此列表中指定位置的元素编检。
int size() 返回此列表中的元素?cái)?shù)。
default void sort(Comparator<? super E> c) 使用隨附的 Comparator排序此列表來(lái)比較元素扰才。
Object[] toArray() 以正確的順序(從第一個(gè)到最后一個(gè)元素)返回一個(gè)包含此列表中所有元素的數(shù)組允懂。

五、Set接口

我們學(xué)習(xí)過的Collection接口中可以存放重復(fù)元素衩匣,也可以不存放重復(fù)元素蕾总,List接口中是可以存放重復(fù)元素的粥航。那么不重復(fù)元素給哪里存放呢?那就是Set接口生百,它里面的集合递雀,所存儲(chǔ)的元素就是不重復(fù)的。

Set接口是通過元素的equals方法蚀浆,來(lái)判斷是否為重復(fù)元素缀程。

Set接口常用的實(shí)現(xiàn)類有:

  • HashSet類

  • LinkedHashSet類

  • TreeSet類

Set接口的特點(diǎn)

  • 唯一

  • 無(wú)序

Set接口的常用方法:

Modifier and Type Method and Description
boolean add(E e) 如果指定的元素不存在,則將其指定的元素添加(可選操作)市俊。
boolean addAll(Collection<? extends E> c) 將指定集合中的所有元素添加到此集合(如果尚未存在)(可選操作)杨凑。
void clear() 從此集合中刪除所有元素(可選操作)。
boolean contains(Object o) 如果此集合包含指定的元素摆昧,則返回 true 撩满。
boolean containsAll(Collection<?> c) 返回 true如果此集合包含所有指定集合的元素。
boolean equals(Object o) 將指定的對(duì)象與此集合進(jìn)行比較以實(shí)現(xiàn)相等绅你。
int hashCode() 返回此集合的哈希碼值伺帘。
boolean isEmpty() 如果此集合不包含元素,則返回 true 忌锯。
Iterator<E> iterator() 返回此集合中元素的迭代器伪嫁。
boolean remove(Object o) 如果存在,則從該集合中刪除指定的元素(可選操作)汉规。
boolean removeAll(Collection<?> c) 從此集合中刪除指定集合中包含的所有元素(可選操作)礼殊。
boolean retainAll(Collection<?> c) 僅保留該集合中包含在指定集合中的元素(可選操作)驹吮。
int size() 返回此集合中的元素?cái)?shù)(其基數(shù))针史。
default Spliterator<E> spliterator() 在此集合中的元素上創(chuàng)建一個(gè) Spliterator
Object[] toArray() 返回一個(gè)包含此集合中所有元素的數(shù)組碟狞。
<T> T[] toArray(T[] a) 返回一個(gè)包含此集合中所有元素的數(shù)組; 返回的數(shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型啄枕。

六、Queue接口

隊(duì)列通常但不一定是以FIFO(先進(jìn)先出)方式排序元素族沃。 除了優(yōu)先級(jí)隊(duì)列之外频祝,優(yōu)先級(jí)隊(duì)列是根據(jù)提供的比較器對(duì)元素進(jìn)行排序,還是元素的自然排序脆淹,以及對(duì)元素LIFO(先進(jìn)先出)進(jìn)行排序的LIFO隊(duì)列(或堆棧)常空。 無(wú)論使用什么順序,隊(duì)列的都是通過調(diào)用remove()poll()刪除的元素盖溺。 在一個(gè)FIFO隊(duì)列漓糙,所有新元素插入到隊(duì)列的尾部 。 其他類型的隊(duì)列可以使用不同的布局規(guī)則烘嘱。 每個(gè)Queue實(shí)現(xiàn)必須指定其排序?qū)傩浴?/p>

Queue的常用方法:

Modifier and Type Method and Description
boolean add(E e) 將指定的元素插入到此隊(duì)列中昆禽,如果可以立即執(zhí)行此操作蝗蛙,而不會(huì)違反容量限制, true在成功后返回 IllegalStateException如果當(dāng)前沒有可用空間醉鳖,則拋出IllegalStateException捡硅。
E element() 檢索,但不刪除盗棵,這個(gè)隊(duì)列的頭壮韭。
boolean offer(E e) 如果在不違反容量限制的情況下立即執(zhí)行,則將指定的元素插入到此隊(duì)列中漾根。
E peek() 檢索但不刪除此隊(duì)列的頭泰涂,如果此隊(duì)列為空,則返回 null 辐怕。
E poll() 檢索并刪除此隊(duì)列的頭逼蒙,如果此隊(duì)列為空,則返回 null 寄疏。
E remove() 檢索并刪除此隊(duì)列的頭是牢。

壓入元素(添加):add()、offer() 相同:未超出容量陕截,從隊(duì)尾壓入元素驳棱,返回壓入的那個(gè)元素。 區(qū)別:在超出容量時(shí)农曲,add()方法會(huì)對(duì)拋出異常社搅,offer()返回false

彈出元素(刪除):remove()、poll() 相同:容量大于0的時(shí)候乳规,刪除并返回隊(duì)頭被刪除的那個(gè)元素形葬。 區(qū)別:在容量為0的時(shí)候,remove()會(huì)拋出異常暮的,poll()返回false

獲取隊(duì)頭元素(不刪除):element()笙以、peek() 相同:容量大于0的時(shí)候,都返回隊(duì)頭元素冻辩。但是不刪除猖腕。 區(qū)別:容量為0的時(shí)候,element()會(huì)拋出異常恨闪,peek()返回null倘感。

七、Map接口

Map接口下的集合與Collection接口下的集合咙咽,它們存儲(chǔ)數(shù)據(jù)的形式不同

  • Collection中的集合老玛,元素是孤立存在的(理解為單身),向集合中存儲(chǔ)元素采用一個(gè)個(gè)元素的方式存儲(chǔ)。

  • Map中的集合逻炊,元素是成對(duì)存在的(理解為夫妻)互亮。每個(gè)元素由鍵與值(key - value)兩部分組成,通過鍵可以找對(duì)所對(duì)應(yīng)的值余素。

  • Collection中的集合稱為單列集合豹休,Map中的集合稱為雙列集合。

  • 需要注意的是桨吊,Map中的集合不能包含重復(fù)的鍵威根,值可以重復(fù);每個(gè)鍵只能對(duì)應(yīng)一個(gè)值视乐。

  • Map中常用的集合為HashMap集合洛搀、LinkedHashMap集合。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佑淀,一起剝皮案震驚了整個(gè)濱河市留美,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伸刃,老刑警劉巖谎砾,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捧颅,居然都是意外死亡景图,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門碉哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)挚币,“玉大人,你說我怎么就攤上這事扣典∽北希” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵激捏,是天一觀的道長(zhǎng)设塔。 經(jīng)常有香客問我凄吏,道長(zhǎng)远舅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任痕钢,我火速辦了婚禮图柏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘任连。我一直安慰自己蚤吹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裁着,像睡著了一般繁涂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上二驰,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天扔罪,我揣著相機(jī)與錄音,去河邊找鬼桶雀。 笑死矿酵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矗积。 我是一名探鬼主播全肮,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棘捣!你這毒婦竟也來(lái)了辜腺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乍恐,失蹤者是張志新(化名)和其女友劉穎哪自,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁熏,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壤巷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞧毙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧华。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖宙彪,靈堂內(nèi)的尸體忽然破棺而出矩动,到底是詐尸還是另有隱情,我是刑警寧澤释漆,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布悲没,位于F島的核電站,受9級(jí)特大地震影響男图,放射性物質(zhì)發(fā)生泄漏示姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一逊笆、第九天 我趴在偏房一處隱蔽的房頂上張望栈戳。 院中可真熱鬧,春花似錦难裆、人聲如沸子檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)褂痰。三九已至亩进,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缩歪,已是汗流浹背镐侯。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驶冒,地道東北人苟翻。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骗污,于是被迫代替她去往敵國(guó)和親崇猫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 接著Java集合框架學(xué)習(xí)---深入探究ArrayList源碼(一)繼續(xù)學(xué)習(xí)ArrayList源碼需忿。 ensureC...
    EakonZhao閱讀 1,168評(píng)論 0 3
  • java 集合框架 集合框架的介紹 我們?cè)诔匈I東西的時(shí)候诅炉,如果沒有購(gòu)物車是不是會(huì)很麻煩呢?Java 中集合類是一...
    灰PatrickStar閱讀 272評(píng)論 0 0
  • 簡(jiǎn)介 集合框架:用于存儲(chǔ)數(shù)據(jù)的容器屋厘。 集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)涕烧。任何集合框架都包...
    JourWon閱讀 809評(píng)論 0 13
  • 5分鐘搞定java集合框架 java集合就是一個(gè)容器。 集合概述 l 為了保存 不確定的數(shù)據(jù)汗洒,或者對(duì)象...
    wangchuang2017閱讀 452評(píng)論 0 0
  • 簡(jiǎn)介 集合框架:用于存儲(chǔ)數(shù)據(jù)的容器议纯。 集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包...
    程序論閱讀 21,330評(píng)論 0 1