一、什么是集合
集合是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ǔ)雙列元素。
可以清楚的看到纺铭,
-
Collection接口下有三個(gè)子接口竟纳,分別是:
- Queue接口
- List接口
- Set接口
Map接口
集合里面有一個(gè)重要的接口缘挑,叫做Iterator迭代器接口,用于迭代集合中的元素。
將上圖的接口和實(shí)現(xiàn)類保留巴帮,重新整理用押,得到新圖為:
在這個(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
集合。