react 路由按需載入
- ArrayList的底層資料結構:陣列。
- LinkedList的底層資料結構:連結串列。既實現了
List
介面,又實現了Queue
介面,在使用的時候,如果我們把它當作List,就獲取List的引用,如果我們把它當作Queue,就獲取Queue的引用 - TreeSet,TreeMap的底層資料結構:紅黑樹。
- HashSet的底層資料結構:雜湊表(陣列+連結串列+紅黑樹)。當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹
- HashMap的底層資料結構: 位桶+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹
List介面
- 元素有序
- 有索引
- 元素可以重複
ArrayList
- ArrayList的底層就是陣列。陣列查詢快,故ArrayList常用來查詢資料
- 如何擴容? 建立一個新的陣列,再將舊陣列複製進去,這樣長度就增加了
LinkedList
- 底層是連結串列。連結串列增刪快,故LinkedList常用來增刪資料.
Set介面
- 元素無序
- 沒有索引
- 元素不能重複
Collection遍歷刪除元素
1.普通for迴圈:注意每次刪除之後索引要--
2.Iterator遍歷:不過要使用Iterator
類中的remove
方法,如果用List
中的remove
方法會報錯
3.增強for迴圈foreach
:不能刪除,強制用List中的remove方法會報錯
Map介面
HashMap
- 鍵值對
- 無序,不支援排序
- 採用雜湊演算法,查詢很快
- key可以存null
- value可以重複
- 鏈地址法解決雜湊衝突
雜湊表
Set的元素不可重複,這個問題該如何解決?
若是我的話,我肯定會想:將新的元素和Set中的每一個元素比較一遍不就可以了?如果有相等的,就不新增;如果有不相等的,就新增。
這樣做有問題麼,理論上是沒問題的,但是效率太低太低了,每次新增一個元素就要將元素遍歷一遍。
為了解決這個問題,就弄出了雜湊表。
雜湊表可以用來高效率解決元素不可重複這個問題,其本質就是:陣列+連結串列+紅黑樹。
所以如果新建了一個物件,需要重寫hashCode方法和equals方法
- key,value都不可為null
- 執行緒安全
- 雜湊值就有點類似於陣列中的索引,因為雜湊值不同其元素必定不同
- 如果沒有相同的雜湊值,直接新增進集合
- 如果有相同的雜湊值,再用equals方法比較內容是否一樣
- 擴容
- 雜湊表中陣列預設長度16,如果陣列中的元素超過了75%就開始擴容
- 如果連結串列元素數量超過8,就將連結串列重構成紅黑樹。連結串列查詢是很慢的,所以為了查詢效率,連結串列元素數量過多,就會重構成紅黑樹,紅黑樹查詢效率比連結串列要快
ConcurrentHashMap
原理:類中包含兩個靜態內部類HashEntry和Segment,HashEntry封裝了鍵值對對映表,一個物件表示
一個鍵值對,且在內部是以連結串列的形式存在,Segment是一個鎖物件,守護整個雜湊對映表的若干個
桶,每個桶代表由若干個HashEntry物件連起來的連結串列,一個 ConcurrentHashMap 例項中包含由若
幹個 Segment 物件組成的陣列,在 HashEntry 類中,key,hash 和 next 域都被宣告為 final 型,
value 域被宣告為 volatile 型。在ConcurrentHashMap 中,在雜湊時如果產生“碰撞”,將採用
“分離連結法”來處理“碰撞”:把“碰撞”的 HashEntry 物件連結成一個連結串列。由於 HashEntry
的 next 域為 final 型,所以新節點只能在連結串列的表頭處插入.
Segment 類繼承於 ReentrantLock 類,從而使得 Segment 物件能充當鎖的角色。每個
Segment 物件用來守護其(成員物件 table 中)包含的若干個桶。
- 鎖分段技術:首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問
其中一個段資料的時候,其他段的資料也能被其他執行緒訪問。
SortedMap介面
- 有序
- 支援排序
- 不可存null
- 查詢較慢
- value可以重複
- 採用紅黑樹排序,可以呼叫Comparator型別的構造方法進行定製排序
- TreeMap是它的實現類,繼承體系 Map -> SortMap -> NavigbleMap -> TreeMap