標籤:
集合也叫作容器類。它的功能相當於一個容器。
Java的集合(容器),它是用來”裝對象的“。
Set集合
Set集合幾乎等同於Collection集合。它們的行為幾乎一致。
遍曆Set的兩種方式:
1.用迭代器
2.用foreach迴圈
HashSet
HashSet的儲存機制:
1、當有元素加進來的時,HashSet會調用該對象的hashCode()方法,得到一個int值。
2、根據hashCode的()返回的int值,計算出它在HashSet中的儲存位置(底層實際採用數組儲存元素的索引,計算得到在數組中的索引值)
3、如果加入的位置為空白,則直接加入,如果該位置已經有元素,則此處會形成鏈表。
取元素時與此類似。
1、當要去一個元素時,HashSet會調用該對象的hashCode()方法,得到一個int值。
2、根據hashCode的()返回的int值,計算出它在HashSet的【底層數組】中的儲存位置(數組中的索引)。
3、如果該位置恰好是要找的元素,直接取出即可,如如果該位置由鏈表,則要通過”挨個“搜尋鏈表中的元素。
HashSet的構造方法:HashSet(int initialCapacity, float loadFactor)
initialCapacity:控制底層數組的長度,預設為16
loadFactor:負載因子,HashSet判斷是否【底層數組快滿】時的依據。當判斷認為數組快滿時,系統會自動建立一個長度為原來2倍的數組,並且將原來數組的元素複製到新數組,原來的數組成為了垃圾。專業術語叫做”rehash(重hash)“。
loadFactor的預設大小為0.75。
loadFactor越小,越消耗記憶體,loadFactor越大,效能越低。
hashSet怎樣判斷兩個對象是否相等:
1、兩個對象的hashCode()傳回值相同
2、兩個對象的equals()方法比較傳回值為true
這就要求我們自訂類的hashCode()和equals()方法是一致的,要求重寫equals()所用的關鍵屬性與計算hashCode()的關鍵屬性一致。
HashSet的子類:LinkedHashSet
它與HashSet的儲存機制相同。
但LinkedHashSet額外維護一個鏈表,用來記錄元素的添加順序。
TreeSet
特徵:保證Set裡的元素是”有大小排序“的。
TreeSet————它是標準的紅/黑樹狀結構
樹—>二叉樹—>排序二叉樹—>平衡二叉樹—>紅/黑樹狀結構。
TreeSet的儲存機制:
底層由一棵”紅/黑樹狀結構“存放所有的資料。存取效能與檢索效能也比較好。
在HashSet沒有出現大量的鏈表的情況下,HashSet的效能要比TreeSet效能好。
TreeSet要求對象必須是可以排序的:
1、自然排序。要求所有的集合元素實現Comparable介面。
集合元素實現了Comparable介面後,集合元素自身就可以排序。
2、定製排序。要求建立TreeSet對象的時候傳入一個Comparator對象。
Comparator對象負責對集合元素進行排序,集合元素無需實現Comparable介面。
TreeSet怎樣才算兩個對象時相等?
1、只有兩個對象通過compareTo()方法比較的傳回值為0,TreeSet才認為兩個對象相等。
List集合
List集合封裝了線性表的資料結構。
它提供大量的”根據索引“來存、取元素的方法。
由於List根據索引來存、取元素,因此它多了一個遍曆元素的方法。
ArrayList與Vector的儲存機制:
它們的底層是基於數組的,它們對元素的儲存完全是基於數組的。 —— 因此效能非常快。
ArrayList與Vector的區別:
1、Vector是JDK1.0就有的集合,從JDK1.2以後SUN公司重新設計了ArrayList來代替Vector。
2、Vector是安全執行緒的,ArrayList是線程不安全的。但ArrayList的效能要比Vector的好。
即使在多線程的環境下,可以使用Collections的方法把ArrayList變成安全執行緒的。
LinkedList
既是線性表,又是隊列,還是棧。(棧和隊列是受限的線性表)。
LinkedList的底層是基於鏈表實現的。通常認為它的效能比不上ArrayList。
ArrayList:由於根據底層數組的索引存取元素的,所以效能非常快。
當插入、刪除元素時,後面所有的元素都要跟上”整體搬家“。
LinkedList:由於底層採用鏈表來儲存元素,要根據遍曆來存取元素,所以效能較低。
當插入、刪除元素時,後面所有的元素無需”整體搬家“,因此效能非常好。
Map集合
對比以上兩圖,發現二者的結構非常相識,Map與Set一一對應。實質上Set底層的實現就是通過Map子類的方法,可以通過查看Set相關的API文檔驗證。當Map的value值為null,只考慮key的時候,Map就變為了Set。
HashSet底層是由HashMap實現,HashMap通過“hash”演算法控制資料在集合中的儲存,類似於“一個蘿蔔一個坑”。
TreeSet底層是由TreeMap實現,TreeMap就是真正的紅/黑樹狀結構。
註:對於Map而言,value只是它的附屬物,幾乎沒有什麼要求,因此Map主要是對key由要求。
HashMap
HashMap會通過key的hashCode()方法的傳回值來計算其存、取位置。
HashMap怎樣才算兩個key重複呢?
1、通過equals()方法比較的傳回值為true
2、兩個key的hashCode()傳回值相同
TreeMap
底層的紅/黑樹狀結構只對key進行排序
TreeMap要求key必須是可以排序的:
1、自然排序。要求所有的key實現Comparable介面。
2、定製排序。要求建立TreeMap對象的時候傳入一個Comparator介面的對象。
TreeMap怎樣才算兩個key相等?
1、通過compareTo()方法比較的傳回值為0,這就表明兩個元素相等。
HashMap與HashTable的區別:
1、HashTable是從JDK1.0就有的,盡量少用。
2、HashTable不允許null作為key、value。但HashMap允許。
3、HashTable是安全執行緒的(實現的不好)
HashMap是線程不安全的。HashMap的效能好。
除此以為HashMap與HashTable幾乎是相同的。
Java基礎知識總結之類的集合