天天看點

Java 集合架構超詳細!

作者:微風01

簡介

Java 提供了用于管理和操作資料的接口。

這稱為 Java 集合架構 (JCF)。

由于它根據要存儲和管理的資料的類型和特征提供各種形式和實作,

讓我們根據需要的情況應用和使用它。

JCF

Java 集合架構超詳細!

JCF是指一個資料集接口架構,它統稱為 Collection 和 Map 接口。

一組資料被定義為 Collection ,它擴充了 Iterable 接口。

Iterable 實作了一個接口結構,允許通路屬于集合的元素。

this 的通路被定義為通過 Iterator 通路。

Collection 提供一維資料管理。

具有代表性的Collection實作接口如下:

List :保證順序,不保證唯一性(即可能出現重複)。

Queue:實作了一個通用的隊列類型結構。

Set :不保證順序,但保證唯一性(不重複)。

Map: 具有二維(鍵值)結構。

List

一個索引的、有序的集合。

典型的實作類是:

  • ArrayList

每個資料都附有索引(順序),通過它可以快速通路。

但是,在删除或插入中間資料的情況下,整個資料結構都會被修改。

是以,記憶體效率低下。

  • LinkedList

為每個資料生成一個點,并使用該點組成每個資料。

當删除或插入發生時,記憶體效率低下最小化,但搜尋資料時時間很慢。

  • Vector

線程安全得到保證,在通路線程時通過加鎖來保證線程同步。

它用于保證在多線程環境中的穩定值。

  • Stack

這是一個典型隊列結構的資料結構。

Set

是一種不保證順序,保證唯一性的資料結構。

也就是說,它是一個不重疊的無序資料結構。

- HashSet : 最純粹的集合資料結構,完全随機排序。

通過覆寫equals和hashCode,區分對象,從根本上防止重複存儲。

- LinkedHashSet:這是一個Set資料結構,按照輸入順序存儲資料。

它繼承并實作了HashSet,按插入順序管理資料。

- TreeSet:是一種内部按升序排序的Set資料結構。

添加和删除資料需要時間,但搜尋和排序非常好(當然因為它是樹結構...)

Map

它是一種以鍵值格式以二維形式管理資料的資料結構。

導入資料時,一種序列是鍵,它所在的列是值,是以你可以把它看成是一個即時的、動态的小型資料庫。

基本上不保證資料辨別符Key的順序。

  • HashMap:是一種純Map資料結構,資料以完全随機的順序存儲。
  • TreeMap:它是一種Map資料結構,其中的鍵在内部進行了排序。

插入删除操作速度快,特點是自動排序。

  • HashTable:線程安全的同步方法組合。

是以,它是一種用于在多線程環境下保證穩定值的資料結構。

  • LinkedHashMap:它是一種Map資料結構,按照輸入的順序存儲資料。

HashMap 是随機輸出和有序結構,而 LinkedHashMap 保持插入順序。

Queue

它是一種資料結構,對應于隊列資料結構的一般概念。

從尾巴到超市結賬的方法(排隊)

計算方式與頭部(出隊)結構相同。

  • AbstractQueue:最純粹的隊列資料結構。

它是第一個為優先級隊列構造的隊列對象,允許将其聲明和實作為原始隊列。

與一般通過中間資料結構的其他資料結構不同,它實作了 AbstractCollection 類,這是 Collection 接口的抽象類。

  • LinkedList:這是一個使用連結清單實作的隊列資料結構。

這是一個用于實作通用隊列的實作類。

  • ArrayDeque:這是一個作為甲闆資料結構實作的隊列資料結構。

可以在前端(head)和尾部(tail)同時實作出隊(删除)和入隊(插入)操作。

  • PriorityQueue:這是一個優先級隊列資料結構。

通過為每個資料實作優先級來排隊處理任務

  • BlockingQueue:這是為確定線程安全而實作的資料結構。

如果兩個線程同時通路出隊任務,就會出現異常。

為了解決這個問題,通過 Concurrent 包實作并提供了阻塞的概念。

它通過線程等待通用隊列的 put、offer、take、poll、peek 來工作。

換句話說,如果隊列在條目之間飽和或為空,或者如果另一個線程正在通路它,則線程等待并在它被釋放時執行指令。

特别是,可以使用一種稱為 drainTo(Collection) 的方法,放入該集合的所有元素 (c)

可以使用下面兩種來實作:

ArrayBlockingQueue

LinkedBlockingQueue

6.Deque(雙端隊列)

擴充 Queue 接口的概念。

一個普通的隊列可以從Head取資料(dequeue),從tail放資料(enqueue)。

實作方式:

  • linkedList:基于 LinkedList 的索引資料結構。

它是一種允許基本甲闆構造的實作。

  • ArrayDeque:這是一種用于建構索引的資料結構。

此實作由 Array 支援,是以非常高效,因為它會立即移動而無需額外的記憶體引用。

  • LinkedBlockingDeque

提供允許單個線程一次隻能通路一個(阻塞)的功能。

  • ConcurrentLinkedDeque:保證并行線程安全的索引結構。

正如Concurrent這個詞所說的那樣,它是一種保證ThreadSafe的保證資料結構。

由于是Linked資料結構,是以具有Linked的大部分優點和缺點。

Stack

它是一種實作常用棧概念的資料結構。

既然是繼承了遺留的Vector建構的資料結構,那麼Thread Safe自然是有保證的,

由于并發通路線程固定為單一資料結構,不适合作為多線程環境下的資料結構。

  • Stack:這是一種常用的棧資料結構。

堆中使用的概念被實作為方法。

Iterator(疊代器)

Iterator 是一個接口,它指定了一個可通路由 Collection 擴充的 Iterable 的接口。

該實作可以通路 Collection 并檢索其元素。

Iterable(可疊代對象)

簡單來說,For語句可以操作的資料結構是Iterable資料結構的一種實作。

換句話說,如果目标資料可以通過疊代(for,while)通路,它擴充了Iterable。

  • 任何 Iterable 擴充接口實作

當然...擴充 Iterable 的實作是 Iterable 的目标。

總結:

以上内容是很基礎的集合知識,幫助我們平時開發的時候更正确的去使用集合結構以及避免BUG困擾。這些知識需要牢記,值得反複查閱。