1. 程式人生 > >MAP、SET、LIST、QUEUE、STACK的特點與用法

MAP、SET、LIST、QUEUE、STACK的特點與用法

這裡是修真院後端小課堂,每篇分享文從

【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴充套件思考】【更多討論】【參考文獻】

八個方面深度解析後端知識/技能,本篇分享的是:

MAP、SET、LIST、QUEUE、STACK的特點與用法

1.背景介紹

MAP

Map用於儲存具有"對映關係"的資料,因此Map集合裡儲存著兩組值,一組值用於儲存Map裡的key,另外一組值用於儲存Map裡的value。 key和value都可以是任何引用型別的資料。Map的key不允許重複,即同一個Map物件的任何兩個key通過equals方法比較結果總是返回false。

關於Map,我們要從程式碼複用的角度去理解,java是先實現了Map,然後通過包裝了一個所有value都為null的Map就實現了Set集合 Map的這些實現類和子介面中key集的儲存形式和Set集合完全相同(即key不能重複) Map的這些實現類和子介面中value集的儲存形式和List非常類似(即value可以重複、根據索引來查詢)

SET

Set集合類似於一個罐子,"丟進"Set集合裡的多個物件之間沒有明顯的順序。Set繼承自Collection介面,不能包含有重複元素(記住,這是整個Set類層次的共有屬性)。 Set判斷兩個物件相同不是使用"=="運算子,而是根據equals方法。也就是說,我們在加入一個新元素的時候,如果這個新元素物件和Set中已有物件進行注意equals比較都返回false,則Set就會接受這個新元素物件,否則拒絕。

因為Set的這個制約,在使用Set集合的時候,應該注意兩點:1) 為Set集合裡的元素的實現類實現一個有效的equals(Object)方法、2) 對Set的建構函式,傳入的Collection引數不能包含重複的元素

LIST

List集合代表一個元素有序、可重複的集合,集合中每個元素都有其對應的順序索引。 List集合允許加入重複元素,因為它可以通過索引來訪問指定位置的集合元素。List集合預設按元素的新增順序設定元素的索引。

如果涉及到“棧”、“佇列”、“連結串列”等操作,請優先考慮用 List。至於是用哪個 List 則分如下: 1、對於需要快速插入、刪除元素,則需使用 LinkedList。 2、對於需要快速訪問元素,則需使用 ArrayList。 3、對於“單執行緒環境”或者“多執行緒環境,但是 List 僅被一個執行緒操作”,需要考慮使用非同步的類, 如果是“多執行緒環境,切 List 可能同時被多個執行緒操作”,考慮使用同步的類(如Vector)。

STACK

Stack是Vector提供的一個子類,用於模擬"棧"這種資料結構(後進先出LIFO) 
方法:push、pop、peek、empty、seatch

QUEUE

Queue用於模擬"佇列"這種資料結構(先進先出FIFO)。佇列的頭部儲存著佇列中存放時間最長的元素,佇列的尾部儲存著佇列中存放時間最短的元素。 新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會返回佇列頭部的元素,佇列不允許隨機訪問佇列中的元素。結合生活中常見的排隊就會很好理解這個概念

 

2.知識剖析

MAP常用子類,HASHMAP

和HashSet集合不能保證元素的順序一樣,HashMap也不能保證key-value對的順序。 並且類似於HashSet判斷兩個key是否相等的標準也是:兩個key通過equals()方法比較返回true、同時兩個key的hashCode值也必須相等

HashMap常用方法:put、get、remove

SET常用例項化子類--HASHSET
HashSet是Set介面的典型實現,HashSet使用HASH演算法來儲存集合中的元素,因此具有良好的存取和查詢效能。 當向HashSet集合中存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據該HashCode值決定該物件在HashSet中的儲存位置。 值得注意的是,HashSet集合判斷兩個元素相等的標準是兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()方法的返回值相等 
它包含的方法:contains、add、remove、clear、clone、isEmpty、size、toArray

LIST常用例項子類--ARRAYLIST

ArrayList是基於陣列實現的List類,它封裝了一個動態的增長的、允許再分配的Object[]陣列。

Vector和ArrayList在用法上幾乎完全相同,但由於Vector是一個古老的集合,所以Vector提供了一些方法名很長的方法, 但隨著JDK1.2以後,java提供了系統的集合框架,就將Vector改為實現List介面,統一歸入集合框架體系中

 

3.常見問題

List、Set、Map有什麼區別?
 

4.解決方案

List:

1.可以允許重複的物件。

2.可以插入多個null元素。

3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。

4.常用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最為流行,它提供了使用索引的隨意訪問, 而 LinkedList 則對於經常需要從 List 中新增或刪除元素的場合更為合適。

-----------------------------------

Set:

1.不允許重複物件

2. 無序容器,你無法保證每個元素的儲存順序,TreeSet通過 Comparator 或者 Comparable 維護了一個排序順序。

3. 只允許一個 null 元素

4.Set 介面最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。 最流行的是基於 HashMap 實現的 HashSet;TreeSet還實現了SortedSet介面, 因此 TreeSet是一個根據其 compare() 和 compareTo() 的定義進行排序的有序容器。

-----------------------------------

Map:

1.Map不是collection的子介面或者實現類。Map是一個介面。

2.Map 的 每個 Entry 都持有兩個物件,也就是一個鍵一個值,Map 可能會持有相同的值物件但鍵物件必須是唯一的。

3. TreeMap 也通過 Comparator 或者 Comparable 維護了一個排序順序。

4. Map 裡你可以擁有隨意個 null 值但最多隻能有一個 null 鍵。

5.Map 介面最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

 

5.編碼實戰

詳見視訊

 

6.擴充套件思考

Iterator是什麼?

Iterator介面提供遍歷任何Collection的介面。我們可以從一個Collection中使用迭代器方法來獲取迭代器例項。迭代器取代了Java集合框架中的Enumeration。迭代器允許呼叫者在迭代過程中移除元素。

 

7.    參考文獻

Java集合類: Set、List、Map、Queue使用場景梳理

http://www.cnblogs.com/LittleHann/p/3690187.html

List、Set、Map的區別

https://www.cnblogs.com/IvesHe/p/6108933.html

 

8.    更多討論

Q1:面試題:什麼場景下使用list,set,map呢? 
A1:

1.如果你經常會使用索引來對容器中的元素進行訪問,那麼 List 是你的正確的選擇。 如果你已經知道索引了的話,那麼 List 的實現類比如 ArrayList 可以提供更快速的訪問,如果經常新增刪除元素的,那麼肯定要選擇LinkedList。

2.如果你想容器中的元素能夠按照它們插入的次序進行有序儲存,那麼還是 List,因為 List 是一個有序容器,它按照插入順序進行儲存。

3.如果你想保證插入元素的唯一性,也就是你不想有重複值的出現,那麼可以選擇一個 Set 的實現類,比如 HashSet、LinkedHashSet 或者 TreeSet。 所有Set的實現類都遵循了統一約束比如唯一性,而且還提供了額外的特性比如 TreeSet 還是一個 SortedSet,所有儲存於 TreeSet 中的元素可以使用 Java 裡的 Comparator 或者 Comparable 進行排序。LinkedHashSet 也按照元素的插入順序對它們進行儲存。

4.如果你以鍵和值的形式進行資料儲存那麼 Map 是你正確的選擇。你可以根據你的後續需要從 Hashtable、HashMap、TreeMap 中進行選擇。


Q2:JAVA是如何定位元素位置的?
A2:通過hashcode定位。在集合內放入元素時放入值相同不同引用和相同引用的區別


Q3:ArrayList和LinkedList的增刪查速度比較?
A3:當資料量較大時,大約在容量的1/10處開始,LinkedList的效率就開始沒有ArrayList效率高了,特別到一半以及後半的位置插入時,LinkedList效率明顯要低於ArrayList,而且資料量越大,越明顯。

 

今天的分享就到這裡啦,歡迎大家點贊、轉發、留言、拍磚~

 

 

PPT連結 視訊連結

更多內容,可以加入IT交流群565734203與大家一起討論交流

這裡是技能樹·IT修真院:https://www.jnshu.com,初學者轉行到網際網路的聚集地