(3)Collection、List、Set、雜湊表
(1)Collection 單列集合的頂層介面
List 有序 有索引 可重複
ArrayList
- 底層是陣列
- 查詢塊(有索引,記憶體連續) 增刪慢(長度不可變,每次修改都需要新建陣列))
- 執行緒不安全 效率高
LinkedList
- 底層是連結串列
- 查詢慢(在記憶體內是分散的)
- 增刪快(通過修改關聯的前後資料地址進行修改:本質上並沒真的進行增減,只是修改了資料之間的關聯的地址)
- 執行緒不安全 效率
Vector
- 底層是陣列
- 查詢塊 增刪慢
- 執行緒安全 效率低
Set 元素唯一
HashSet
- 底層是雜湊表 查詢速度嗷嗷快
- 無序 唯一
- 通過hashCode方法和equals方法保證元素唯一
先判斷hashCode方法
不同 新增到集合
相同 繼續比較equals方法
不同 新增到集合
相同 不新增
LinkedHashSet
- 底層是連結串列 + 雜湊表
- 連結串列保證元素有序 雜湊表保證元素唯一
- 通過hashCode方法和equals方法保證元素唯一
先判斷hashCode方法
不同 新增到集合
相同 繼續比較equals方法
不同 新增到集合
相同 不新增
- 查詢多 ArrayList
- 增刪多 LinkedList
- 保證唯一 HashSet
- 保證唯一有序 LinkedHashSet
- 什麼都不知道 ArrayList
(2)雜湊表的特點
HashSet集合儲存資料的結構(雜湊表)
什麼是雜湊表呢?
在JDK1.8之前,雜湊表底層採用陣列+連結串列實現,即使用陣列處理衝突,同一hash值的連結串列都儲存在一個數組裡。 但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中,哈 希表儲存採用陣列+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢 時間。
簡單的來說,雜湊表是由陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現的,如下圖所示。
HashCode預設是取地址值,String和基本型別的包裝類都重寫了HashCode方法,所以取得 不是地址值。
String比較:先比較hashcode,如果不同就停止;如果相同,再呼叫equals
原因:String重寫了HashCode方法,所以獲取的不再是地址值,而是自定義的一個演算法(源 碼中可以看到這個演算法);當hashCode值不同時, 兩個字串必定不相同,如果值相同,則這兩個字串不一定相同(如“abc”和“cba”,雜湊碼相同,但內容不同),需要再次呼叫equals方法比較
好處:減少equals方法的呼叫,提高效能。
(3)使用HashSet集合儲存自定義元素
HashSet不能重複是因為底層做了排重,原理是先比較hashcode,再呼叫equals比較
對於自定義物件,使用Set,必須重寫HashCode和equals方法(否則會出現重複)
如果不重寫這兩個方法,這個物件會呼叫Object的方法,而Object的hashcode獲取的是地址值,必定不相同,也就無法去除重複。
(4)Collections 集合的工具類
public static void shuffle(List<?> list):打亂集合順序。
public static <T> void sort(List<T> list):將集合中元素按照預設規則排序。
public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規則排序。
Comparator比較
相當於有個裁判 來進行判斷
自定義規則來進行排序
引數1-引數2 升序
引數2-引數1 降序