1. 程式人生 > >(3)Collection、List、Set、雜湊表

(3)Collection、List、Set、雜湊表

 

(1)Collection 單列集合的頂層介面

List 有序 有索引 可重複

ArrayList

  • 底層是陣列
  • 查詢塊(有索引,記憶體連續) 增刪慢(長度不可變,每次修改都需要新建陣列))
  • 執行緒不安全 效率高

LinkedList

  • 底層是連結串列
  • 查詢慢(在記憶體內是分散的)
  • 增刪快(通過修改關聯的前後資料地址進行修改:本質上並沒真的進行增減,只是修改了資料之間的關聯的地址)
  • 執行緒不安全 效率

Vector

  • 底層是陣列
  • 查詢塊 增刪慢
  • 執行緒安全 效率低

Set 元素唯一

HashSet

  • 底層是雜湊表 查詢速度嗷嗷快
  • 無序 唯一
  • 通過hashCode方法和equals方法保證元素唯一

先判斷hashCode方法

不同 新增到集合

相同 繼續比較equals方法

不同 新增到集合

相同 不新增

LinkedHashSet

  • 底層是連結串列 + 雜湊表
  • 連結串列保證元素有序 雜湊表保證元素唯一
  • 通過hashCode方法和equals方法保證元素唯一

先判斷hashCode方法

不同 新增到集合

相同 繼續比較equals方法

不同 新增到集合

相同 不新增

  1. 查詢多 ArrayList
  2. 增刪多 LinkedList
  3. 保證唯一 HashSet
  4. 保證唯一有序 LinkedHashSet
  5. 什麼都不知道 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 降序