1. 程式人生 > 其它 >冰墩墩

冰墩墩

Map:是一種鍵-值對(key-value)集合,Map 集合中的每一個元素都包含一個鍵物件和一個值物件。其中,鍵物件不允許重複(可存在一個null),而值物件可以重複,並且值物件還可以是 Map 型別的,就像陣列中的元素還可以是陣列一樣。
Map 介面主要有兩個實現類:HashMap 類和 TreeMap 類。其中,HashMap 類按雜湊演算法來存取鍵物件,而 TreeMap 類可以對鍵物件進行排序。還有HashTable

HashMap:

HashMap底層資料結構為陣列+連結串列+紅黑樹,主要資料儲存物件為Node<k, V>[] table(jdk1.7使用的Entry), 關鍵方法put();

擴容機制:如果某個桶中的連結串列長度大於等於8了,則會判斷當前的hashmap的容量是否大於64,如果小於64,則會進行擴容;如果大於64,則將連結串列轉為紅黑樹。

  1. 先⽣成新陣列

  2. 遍歷⽼陣列中的每個位置上的連結串列或紅⿊樹

  3. 如果是連結串列,則直接將連結串列中的每個元素重新計算下標,並新增到新陣列中去

  4. 如果是紅⿊樹,則先遍歷紅⿊樹,先計算出紅⿊樹中每個元素對應在新陣列中的下標位置

    a. 統計每個下標位置的元素個數

    b. 如果該位置下的元素個數超過了6,則⽣成⼀個新的紅⿊樹,並將根節點的新增到新陣列的對應位置

    c. 如果該位置下的元素個數沒有超過6,那麼則⽣成⼀個連結串列,並將連結串列的頭節點新增到新陣列的對應位置

  5. 所有元素轉移完了之後,將新陣列賦值給HashMap物件的table屬性

HashTable: 底層資料結構為陣列+連結串列,與HashMap相似,但其是執行緒安全的,因為其public方法上都增有synchronized。

TreeMap:

TreeMap底層資料結構為Entry(雙向連結串列),儲存資料時通過comparator比較器進行比較,找到其put的物件的key所在的位置。所生成的map是有序的。