Java基礎知識總結之類的集合

來源:互聯網
上載者:User

標籤:

集合也叫作容器類。它的功能相當於一個容器。

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基礎知識總結之類的集合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.