Java集合Collection、Map(JDK1.8的HashMap)的各個功能特點及總結
阿新 • • 發佈:2019-02-05
Java中集合總結
可以 點選看大圖
結構分析
- 陣列 : 查詢快,增刪慢
- 連結串列 : 查詢慢,增刪快
- 雜湊表 : 保證元素的唯一
引用塊內容
Collection
List
特點: 有序且可重複的
ArrayList
- 底層資料結構是陣列,查詢快,增刪慢
- 執行緒不安全,效率高
Vector
- 底層資料結構是陣列,查詢快,增刪慢
- 執行緒安全,效率低
LinkedList
- 底層資料結構是連結串列,查詢慢,增刪快
- 執行緒不安全,效率高
Set
特點: 無序且不可重複的
HashSet
- 底層資料結構是雜湊表。
- 雜湊表依賴兩個方法:hashCode()和equals()
- 執行順序 :
- 先判斷hashCode()值是否相同
- 如果是,繼續執行equal(),看其返回值
- true : 說明元素重複,不新增
- fasle : 直接新增到集合中
- 如果否,直接新增到集合中
- 最終 :
- 自動生成hashCode()和equals()方法即可
LinkedHashSet
- 底層資料結構由連結串列和雜湊表組成。
- 由連結串列保證元素有序。
- 由雜湊表保證元素唯一。
TreeSet
- 底層資料結構是紅黑樹。(是一種自平衡的二叉樹)
- 如何保證元素唯一性呢?
- 根據比較的返回值是否是0來決定
- 如何保證元素的排序呢?
- 兩種方式
- 自然排序(元素具備比較性)
- 讓元素所屬的類實現Comparable介面
- 比較器排序(集合具備比較性)
- 讓集合接收一個Comparator的實現類物件
- 自然排序(元素具備比較性)
- 兩種方式
Map
HashMap
在JDK1.8之前,HashMap底層是基於雜湊表的,資料結構是陣列+連結串列
在JDK1.8,引入了紅黑樹,資料結構是陣列+連結串列+紅黑樹
JDK1.8的HashMap
引入原因 : 提高HashMap的效能
- 解決發生雜湊碰撞後,連結串列過長從而導致索引效率慢的問題
- 具體:
- 利用紅黑樹快速增刪改查的特點
- 時間複雜度從O(n) 降為 O(logn)
應用場景
- 當連結串列長度>8時,將該連結串列轉換成紅黑樹
- 即紅黑樹作為儲存資料&解決Hash衝突的第3方案
- 無衝突時:存放陣列
- 衝突&連結串列長度<8時:存放在單鏈表
- 衝突&連結串列長度>8時:存放在紅黑樹
Hashtable
- 底層資料結構是雜湊表。
- 雜湊表依賴兩個方法:hashCode()和equals()
- 執行順序 :
- 先判斷hashCode()值是否相同
- 如果是,繼續執行equal(),看其返回值
- true : 說明元素重複,不新增
- fasle : 直接新增到集合中
- 如果否,直接新增到集合中
- 最終 :
- 自動生成hashCode()和equals()方法即可
LinkedHashMap
- 底層資料結構由連結串列和雜湊表組成。
- 由連結串列保證元素有序。
- 由雜湊表保證元素唯一。
TreeMap
- 底層資料結構是紅黑樹。(是一種自平衡的二叉樹)
- 如何保證元素唯一性呢?
- 根據比較的返回值是否是0來決定
- 如何保證元素的排序呢?
- 兩種方式
- 自然排序(元素具備比較性)
- 讓元素所屬的類實現Comparable介面
- 比較器排序(集合具備比較性)
- 讓集合接收一個Comparator的實現類物件
- 自然排序(元素具備比較性)
- 兩種方式
按照實現介面分類:
實現Map介面的有:EnumMap、IdentityHashMap、HashMap、LinkedHashMap、WeakHashMap、TreeMap
實現List介面的有:ArrayList、LinkedList
實現Set介面的有:HashSet、LinkedHashSet、TreeSet
實現Queue介面的有:PriorityQueue、LinkedList、ArrayQueue
根據底層實現的資料結構分類:
- 底層以陣列的形式實現:EnumMap、ArrayList、ArrayQueue
- 底層以連結串列的形式實現:LinkedHashSet、LinkedList、LinkedHashMap
- 底層以hash table的形式實現:HashMap、HashSet、LinkedHashMap、LinkedHashSet、WeakHashMap、IdentityHashMap
- 底層以紅黑樹的形式實現:TreeMap、TreeSet
- 底層以二叉堆的形式實現:PriorityQueue