一、什么是集合
集合是Java提供的儲存數(shù)據(jù)的一種容器,長度不限,類型不限。
Java提供的關(guān)于集合的類和接口都在java.util包里面。
二、集合框架概覽
Java集合,也叫做容器,由一組接口、抽象類、實(shí)現(xiàn)類構(gòu)成。主要由兩大接口派生而來,分別是Collection接口和Map接口,Collection接口存儲單列元素,Map接口存儲雙列元素。

可以清楚的看到,
-
Collection接口下有三個(gè)子接口,分別是:
- Queue接口
- List接口
- Set接口
Map接口
集合里面有一個(gè)重要的接口,叫做Iterator迭代器接口,用于迭代集合中的元素。
將上圖的接口和實(shí)現(xiàn)類保留,重新整理,得到新圖為:

在這個(gè)圖里,都是重要的類和接口。
List, Set, Queue, Map 四者的區(qū)別:
- List :存儲的順序是有序的,內(nèi)容是可以重復(fù)的。
- Set :存儲的順序是無序的,內(nèi)容是不可以重復(fù)的。
- Queue:存儲的順序是有序的,內(nèi)容是可以重復(fù)的,隊(duì)列是按照先進(jìn)先出的順序的。
- Map :Map通過鍵值對的方式來存儲。key是無序的,不重復(fù)。value是無序的,可以重復(fù)。
三、Collection接口
Collection接口雖然繼承了Iterable接口,但是集合的最頂層依然是Collection接口,而非Iterable接口,因?yàn)镮terable接口并不規(guī)范數(shù)據(jù)的存儲,而只是規(guī)范了集合元素的迭代。
既然Collection接口是集合中的頂層接口,那么它中定義的所有功能子類都可以使用。Collection 是層次結(jié)構(gòu)中的根接口。Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復(fù)的元素,而另一些則不允許。一些 collection 是有序的,而另一些則是無序的。
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接口的使用后,再來看看Collection接口中的子類
4.1 List接口介紹:
List是有序的 Collection(也稱為序列)。此接口的用戶可以對列表中每個(gè)元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。與 set 不同,列表通常允許重復(fù)的元素。
List接口的特點(diǎn):
- 它是一個(gè)元素存取有序的集合。例如,存元素的順序是11、22、33,那么集合中元素的存儲就是按照11、22、33的順序完成的。
- 它是一個(gè)帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數(shù)組的索引是一個(gè)道理)。
- 集合中可以有重復(fù)的元素,通過元素的equals方法,來比較是否為重復(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) 將指定的對象與此列表進(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排序此列表來比較元素。 |
Object[] |
toArray() 以正確的順序(從第一個(gè)到最后一個(gè)元素)返回一個(gè)包含此列表中所有元素的數(shù)組。 |
五、Set接口
我們學(xué)習(xí)過的Collection接口中可以存放重復(fù)元素,也可以不存放重復(fù)元素,List接口中是可以存放重復(fù)元素的。那么不重復(fù)元素給哪里存放呢?那就是Set接口,它里面的集合,所存儲的元素就是不重復(fù)的。
Set接口是通過元素的equals方法,來判斷是否為重復(fù)元素。
Set接口常用的實(shí)現(xiàn)類有:
HashSet類
LinkedHashSet類
TreeSet類
Set接口的特點(diǎn)
唯一
無序
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) 將指定的對象與此集合進(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)先級隊(duì)列之外,優(yōu)先級隊(duì)列是根據(jù)提供的比較器對元素進(jìn)行排序,還是元素的自然排序,以及對元素LIFO(先進(jìn)先出)進(jìn)行排序的LIFO隊(duì)列(或堆棧)。 無論使用什么順序,隊(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í)行此操作,而不會違反容量限制, 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()方法會對拋出異常,offer()返回false
彈出元素(刪除):remove()、poll() 相同:容量大于0的時(shí)候,刪除并返回隊(duì)頭被刪除的那個(gè)元素。 區(qū)別:在容量為0的時(shí)候,remove()會拋出異常,poll()返回false
獲取隊(duì)頭元素(不刪除):element()、peek() 相同:容量大于0的時(shí)候,都返回隊(duì)頭元素。但是不刪除。 區(qū)別:容量為0的時(shí)候,element()會拋出異常,peek()返回null。
七、Map接口
Map接口下的集合與Collection接口下的集合,它們存儲數(shù)據(jù)的形式不同
Collection中的集合,元素是孤立存在的(理解為單身),向集合中存儲元素采用一個(gè)個(gè)元素的方式存儲。
Map中的集合,元素是成對存在的(理解為夫妻)。每個(gè)元素由鍵與值(key - value)兩部分組成,通過鍵可以找對所對應(yīng)的值。
Collection中的集合稱為單列集合,Map中的集合稱為雙列集合。
需要注意的是,Map中的集合不能包含重復(fù)的鍵,值可以重復(fù);每個(gè)鍵只能對應(yīng)一個(gè)值。
Map中常用的集合為
HashMap集合、LinkedHashMap集合。