Java 集合框架超詳細!
簡介
Java 提供了用于管理和操作數據的接口。
這稱為 Java 集合框架 (JCF)。
由于它根據要存儲和管理的數據的類型和特征提供各種形式和實現,
讓我們根據需要的情況應用和使用它。
JCF
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
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困擾。這些知識需要牢記,值得反復查閱。