Java集合框架

一、什么是集合

集合是Java提供的儲存數(shù)據(jù)的一種容器,長度不限,類型不限。

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

二、集合框架概覽

Java集合,也叫做容器,由一組接口、抽象類、實(shí)現(xiàn)類構(gòu)成。主要由兩大接口派生而來,分別是Collection接口和Map接口,Collection接口存儲單列元素,Map接口存儲雙列元素。


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 :存儲的順序是有序的,內(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集合。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 接著Java集合框架學(xué)習(xí)---深入探究ArrayList源碼(一)繼續(xù)學(xué)習(xí)ArrayList源碼。 ensureC...
    EakonZhao閱讀 1,250評論 0 3
  • java 集合框架 集合框架的介紹 我們在超市買東西的時(shí)候,如果沒有購物車是不是會很麻煩呢?Java 中集合類是一...
    灰PatrickStar閱讀 305評論 0 0
  • 簡介 集合框架:用于存儲數(shù)據(jù)的容器。 集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包...
    JourWon閱讀 867評論 0 13
  • 5分鐘搞定java集合框架 java集合就是一個(gè)容器。 集合概述 l 為了保存 不確定的數(shù)據(jù),或者對象...
    wangchuang2017閱讀 536評論 0 0
  • 簡介 集合框架:用于存儲數(shù)據(jù)的容器。 集合框架是為表示和操作集合而規(guī)定的一種統(tǒng)一的標(biāo)準(zhǔn)的體系結(jié)構(gòu)。任何集合框架都包...
    程序論閱讀 21,351評論 0 1

友情鏈接更多精彩內(nèi)容