Java 集合框架超詳細(xì)!
簡(jiǎn)介
Java 提供了用于管理和操作數(shù)據(jù)的接口。
這稱(chēng)為 Java 集合框架 (JCF)。
由于它根據(jù)要存儲(chǔ)和管理的數(shù)據(jù)的類(lèi)型和特征提供各種形式和實(shí)現(xiàn),
讓我們根據(jù)需要的情況應(yīng)用和使用它。
JCF
JCF是指一個(gè)數(shù)據(jù)集接口框架,它統(tǒng)稱(chēng)為 Collection 和 Map 接口。
一組數(shù)據(jù)被定義為 Collection ,它擴(kuò)展了 Iterable 接口。
Iterable 實(shí)現(xiàn)了一個(gè)接口結(jié)構(gòu),允許訪(fǎng)問(wèn)屬于集合的元素。
this 的訪(fǎng)問(wèn)被定義為通過(guò) Iterator 訪(fǎng)問(wèn)。
Collection 提供一維數(shù)據(jù)管理。
具有代表性的Collection實(shí)現(xiàn)接口如下:
List :保證順序,不保證唯一性(即可能出現(xiàn)重復(fù))。
Queue:實(shí)現(xiàn)了一個(gè)通用的隊(duì)列類(lèi)型結(jié)構(gòu)。
Set :不保證順序,但保證唯一性(不重復(fù))。
Map: 具有二維(鍵值)結(jié)構(gòu)。
List
一個(gè)索引的、有序的集合。
典型的實(shí)現(xiàn)類(lèi)是:
- ArrayList
每個(gè)數(shù)據(jù)都附有索引(順序),通過(guò)它可以快速訪(fǎng)問(wèn)。
但是,在刪除或插入中間數(shù)據(jù)的情況下,整個(gè)數(shù)據(jù)結(jié)構(gòu)都會(huì)被修改。
因此,內(nèi)存效率低下。
- LinkedList
為每個(gè)數(shù)據(jù)生成一個(gè)點(diǎn),并使用該點(diǎn)組成每個(gè)數(shù)據(jù)。
當(dāng)刪除或插入發(fā)生時(shí),內(nèi)存效率低下最小化,但搜索數(shù)據(jù)時(shí)時(shí)間很慢。
- Vector
線(xiàn)程安全得到保證,在訪(fǎng)問(wèn)線(xiàn)程時(shí)通過(guò)加鎖來(lái)保證線(xiàn)程同步。
它用于保證在多線(xiàn)程環(huán)境中的穩(wěn)定值。
- Stack
這是一個(gè)典型隊(duì)列結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu)。
Set
是一種不保證順序,保證唯一性的數(shù)據(jù)結(jié)構(gòu)。
也就是說(shuō),它是一個(gè)不重疊的無(wú)序數(shù)據(jù)結(jié)構(gòu)。
HashSet : 最純粹的集合數(shù)據(jù)結(jié)構(gòu),完全隨機(jī)排序。
通過(guò)覆蓋equals和hashCode,區(qū)分對(duì)象,從根本上防止重復(fù)存儲(chǔ)。
LinkedHashSet:這是一個(gè)Set數(shù)據(jù)結(jié)構(gòu),按照輸入順序存儲(chǔ)數(shù)據(jù)。
它繼承并實(shí)現(xiàn)了HashSet,按插入順序管理數(shù)據(jù)。
TreeSet:是一種內(nèi)部按升序排序的Set數(shù)據(jù)結(jié)構(gòu)。
添加和刪除數(shù)據(jù)需要時(shí)間,但搜索和排序非常好(當(dāng)然因?yàn)樗菢?shù)結(jié)構(gòu)...)
Map
它是一種以鍵值格式以二維形式管理數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
導(dǎo)入數(shù)據(jù)時(shí),一種序列是鍵,它所在的列是值,所以你可以把它看成是一個(gè)即時(shí)的、動(dòng)態(tài)的小型數(shù)據(jù)庫(kù)。
基本上不保證數(shù)據(jù)標(biāo)識(shí)符Key的順序。
- HashMap:是一種純Map數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)以完全隨機(jī)的順序存儲(chǔ)。
- TreeMap:它是一種Map數(shù)據(jù)結(jié)構(gòu),其中的鍵在內(nèi)部進(jìn)行了排序。
插入刪除操作速度快,特點(diǎn)是自動(dòng)排序。
- HashTable:線(xiàn)程安全的同步方法組合。
因此,它是一種用于在多線(xiàn)程環(huán)境下保證穩(wěn)定值的數(shù)據(jù)結(jié)構(gòu)。
- LinkedHashMap:它是一種Map數(shù)據(jù)結(jié)構(gòu),按照輸入的順序存儲(chǔ)數(shù)據(jù)。
HashMap 是隨機(jī)輸出和有序結(jié)構(gòu),而 LinkedHashMap 保持插入順序。
Queue
它是一種數(shù)據(jù)結(jié)構(gòu),對(duì)應(yīng)于隊(duì)列數(shù)據(jù)結(jié)構(gòu)的一般概念。
從尾巴到超市結(jié)賬的方法(排隊(duì))
計(jì)算方式與頭部(出隊(duì))結(jié)構(gòu)相同。
- AbstractQueue:最純粹的隊(duì)列數(shù)據(jù)結(jié)構(gòu)。
它是第一個(gè)為優(yōu)先級(jí)隊(duì)列構(gòu)造的隊(duì)列對(duì)象,允許將其聲明和實(shí)現(xiàn)為原始隊(duì)列。
與一般通過(guò)中間數(shù)據(jù)結(jié)構(gòu)的其他數(shù)據(jù)結(jié)構(gòu)不同,它實(shí)現(xiàn)了 AbstractCollection 類(lèi),這是 Collection 接口的抽象類(lèi)。
- LinkedList:這是一個(gè)使用鏈表實(shí)現(xiàn)的隊(duì)列數(shù)據(jù)結(jié)構(gòu)。
這是一個(gè)用于實(shí)現(xiàn)通用隊(duì)列的實(shí)現(xiàn)類(lèi)。
- ArrayDeque:這是一個(gè)作為甲板數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的隊(duì)列數(shù)據(jù)結(jié)構(gòu)。
可以在前端(head)和尾部(tail)同時(shí)實(shí)現(xiàn)出隊(duì)(刪除)和入隊(duì)(插入)操作。
- PriorityQueue:這是一個(gè)優(yōu)先級(jí)隊(duì)列數(shù)據(jù)結(jié)構(gòu)。
通過(guò)為每個(gè)數(shù)據(jù)實(shí)現(xiàn)優(yōu)先級(jí)來(lái)排隊(duì)處理任務(wù)
- BlockingQueue:這是為確保線(xiàn)程安全而實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)。
如果兩個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)出隊(duì)任務(wù),就會(huì)出現(xiàn)異常。
為了解決這個(gè)問(wèn)題,通過(guò) Concurrent 包實(shí)現(xiàn)并提供了阻塞的概念。
它通過(guò)線(xiàn)程等待通用隊(duì)列的 put、offer、take、poll、peek 來(lái)工作。
換句話(huà)說(shuō),如果隊(duì)列在條目之間飽和或?yàn)榭?,或者如果另一個(gè)線(xiàn)程正在訪(fǎng)問(wèn)它,則線(xiàn)程等待并在它被釋放時(shí)執(zhí)行命令。
特別是,可以使用一種稱(chēng)為 drainTo(Collection) 的方法,放入該集合的所有元素 (c)
可以使用下面兩種來(lái)實(shí)現(xiàn):
- ArrayBlockingQueue
- LinkedBlockingQueue
Deque(雙端隊(duì)列)
擴(kuò)展 Queue 接口的概念。
一個(gè)普通的隊(duì)列可以從Head取數(shù)據(jù)(dequeue),從tail放數(shù)據(jù)(enqueue)。
實(shí)現(xiàn)方式:
- linkedList:基于 LinkedList 的索引數(shù)據(jù)結(jié)構(gòu)。
它是一種允許基本甲板構(gòu)造的實(shí)現(xiàn)。
- ArrayDeque:這是一種用于構(gòu)建索引的數(shù)據(jù)結(jié)構(gòu)。
此實(shí)現(xiàn)由 Array 支持,因此非常高效,因?yàn)樗鼤?huì)立即移動(dòng)而無(wú)需額外的內(nèi)存引用。
- LinkedBlockingDeque
提供允許單個(gè)線(xiàn)程一次只能訪(fǎng)問(wèn)一個(gè)(阻塞)的功能。
- ConcurrentLinkedDeque:保證并行線(xiàn)程安全的索引結(jié)構(gòu)。
正如Concurrent這個(gè)詞所說(shuō)的那樣,它是一種保證ThreadSafe的保證數(shù)據(jù)結(jié)構(gòu)。
由于是Linked數(shù)據(jù)結(jié)構(gòu),所以具有Linked的大部分優(yōu)點(diǎn)和缺點(diǎn)。
Stack
它是一種實(shí)現(xiàn)常用棧概念的數(shù)據(jù)結(jié)構(gòu)。
既然是繼承了遺留的Vector構(gòu)建的數(shù)據(jù)結(jié)構(gòu),那么Thread Safe自然是有保證的,
由于并發(fā)訪(fǎng)問(wèn)線(xiàn)程固定為單一數(shù)據(jù)結(jié)構(gòu),不適合作為多線(xiàn)程環(huán)境下的數(shù)據(jù)結(jié)構(gòu)。
- Stack:這是一種常用的棧數(shù)據(jù)結(jié)構(gòu)。
堆中使用的概念被實(shí)現(xiàn)為方法。
Iterator(迭代器)
Iterator 是一個(gè)接口,它指定了一個(gè)可訪(fǎng)問(wèn)由 Collection 擴(kuò)展的 Iterable 的接口。
該實(shí)現(xiàn)可以訪(fǎng)問(wèn) Collection 并檢索其元素。
Iterable(可迭代對(duì)象)
簡(jiǎn)單來(lái)說(shuō),F(xiàn)or語(yǔ)句可以操作的數(shù)據(jù)結(jié)構(gòu)是Iterable數(shù)據(jù)結(jié)構(gòu)的一種實(shí)現(xiàn)。
換句話(huà)說(shuō),如果目標(biāo)數(shù)據(jù)可以通過(guò)迭代(for,while)訪(fǎng)問(wèn),它擴(kuò)展了Iterable。
- 任何 Iterable 擴(kuò)展接口實(shí)現(xiàn)
當(dāng)然...擴(kuò)展 Iterable 的實(shí)現(xiàn)是 Iterable 的目標(biāo)。
總結(jié)
以上內(nèi)容是很基礎(chǔ)的集合知識(shí),幫助我們平時(shí)開(kāi)發(fā)的時(shí)候更正確的去使用集合結(jié)構(gòu)以及避免BUG困擾。這些知識(shí)需要牢記,值得反復(fù)查閱。