List、Set、Map 底層實現和使用推薦
阿新 • • 發佈:2018-12-20
List、Set、Map 底層實現和使用推薦
List和Set和Map的實現方式以及儲存方式?
List
常用實現方式有:ArrayList和LinkedList
ArrayList 的儲存方式:陣列,查詢快
LinkedList的儲存方式:連結串列,插入,刪除快
Set
常用實現方式有:HashSet和TreeSet
HashSet的儲存方式:雜湊碼演算法,加入的物件需要實現hashcode()方法,快速查詢元素
TreeSet的儲存方式:按序存放,想要有序就要實現Comparable介面
附加:
集合框架提供了2個實用類:collections(排序,複製、查詢)和Arrays對陣列進行(排序,複製、查詢)
Map
常用實現方式有:HashMap和TreeMap
HashMap的儲存方式:雜湊碼演算法,快速查詢鍵值
TreeMap儲存方式:對鍵按序存放
具體:
1:集合
Collection(單列集合) List(有序,可重複) ArrayList 底層資料結構是陣列,查詢快,增刪慢 執行緒不安全,效率高 Vector 底層資料結構是陣列,查詢快,增刪慢 執行緒安全,效率低 LinkedList 底層資料結構是連結串列,查詢慢,增刪快 執行緒不安全,效率高 Set(無序,唯一) HashSet 底層資料結構是雜湊表。 雜湊表依賴兩個方法:hashCode()和equals() 執行順序: 首先判斷hashCode()值是否相同 是:繼續執行equals(),看其返回值 是true:說明元素重複,不新增 是false:就直接新增到集合 否:就直接新增到集合 最終: 自動生成hashCode()和equals()即可 LinkedHashSet 底層資料結構由連結串列和雜湊表組成。 由連結串列保證元素有序。 由雜湊表保證元素唯一。 TreeSet 底層資料結構是紅黑樹。(是一種自平衡的二叉樹) 如何保證元素唯一性呢? 根據比較的返回值是否是0來決定 如何保證元素的排序呢? 兩種方式 自然排序(元素具備比較性) 讓元素所屬的類實現Comparable介面 比較器排序(集合具備比較性) 讓集合接收一個Comparator的實現類物件 Map(雙列集合) A:Map集合的資料結構僅僅針對鍵有效,與值無關。 B:儲存的是鍵值對形式的元素,鍵唯一,值可重複。 HashMap 底層資料結構是雜湊表。執行緒不安全,效率高 雜湊表依賴兩個方法:hashCode()和equals() 執行順序: 首先判斷hashCode()值是否相同 是:繼續執行equals(),看其返回值 是true:說明元素重複,不新增 是false:就直接新增到集合 否:就直接新增到集合 最終: 自動生成hashCode()和equals()即可 LinkedHashMap 底層資料結構由連結串列和雜湊表組成。 由連結串列保證元素有序。 由雜湊表保證元素唯一。 Hashtable 底層資料結構是雜湊表。執行緒安全,效率低 雜湊表依賴兩個方法:hashCode()和equals() 執行順序: 首先判斷hashCode()值是否相同 是:繼續執行equals(),看其返回值 是true:說明元素重複,不新增 是false:就直接新增到集合 否:就直接新增到集合 最終: 自動生成hashCode()和equals()即可 TreeMap 底層資料結構是紅黑樹。(是一種自平衡的二叉樹) 如何保證元素唯一性呢? 根據比較的返回值是否是0來決定 如何保證元素的排序呢? 兩種方式 自然排序(元素具備比較性) 讓元素所屬的類實現Comparable介面 比較器排序(集合具備比較性) 讓集合接收一個Comparator的實現類物件
2.關於集合選取原則
是否是鍵值物件形式: 是:Map 鍵是否需要排序: 是:TreeMap 否:HashMap 不知道,就使用HashMap。 否:Collection 元素是否唯一: 是:Set 元素是否需要排序: 是:TreeSet 否:HashSet 不知道,就使用HashSet 否:List 要安全嗎: 是:Vector 否:ArrayList或者LinkedList 增刪多:LinkedList 查詢多:ArrayList 不知道,就使用ArrayList 不知道,就使用ArrayList
3:集合的常見方法及遍歷方式
Collection:
add()
remove()
contains()
iterator()
size()
遍歷:
增強for
迭代器
|--List
get()
遍歷:
普通for
|--Set
Map:
put()
remove()
containskey(),containsValue()
keySet()
get()
value()
entrySet()
size()
遍歷:
根據鍵找值
根據鍵值對物件分別找鍵和值