1. 程式人生 > 其它 >雜湊表概述及其儲存過程(存取原理)

雜湊表概述及其儲存過程(存取原理)

雜湊表概述及其儲存過程(存取原理)

1.雜湊表的資料結構

​ jdk1.8之前 陣列+(單)連結串列

jdk1.8之後 陣列+(單)連結串列+紅黑樹

加入紅黑樹的好處,當表夠長的時候,查詢速度慢,此時,把錶轉化成紅黑樹,增加查詢速度

2.雜湊表如何做到的key值不重複(去重)

  • 先獲取雜湊值並比較,如果雜湊值不一樣,就直接存
  • 如果雜湊值一樣,比較內容
    • 如果內容不一樣,直接存
    • 如果內容一樣,後面的會覆蓋前面的

3.儲存細節

  • 雜湊表底層資料初始陣列長度為16,是在第一次put的時候長度才是16,就只是new完,長度為0
  • 雜湊表會自動擴容,每次擴2倍
    • 當陣列容量達到75%時 擴容2倍
    • 0.75稱之為載入因子,意思是當儲存元素達到當前陣列(每擴一次陣列容量都會變化)容量的0.75倍後會自動擴容2倍
    • 當陣列中一個位置上的連結串列長度超過8並且陣列總長度超過64時,連結串列會轉化成紅黑樹

儲存過程:(要儲存的元素 abc 通話 重地)

  • new,不建立陣列

      public static void main(String[] args) {
            HashMap<String,String> hashMap=new HashMap();
        }
    
  • 儲存第一個元素

雜湊表的儲存過程(存取原理):每存入一個新的元素都要走以下五步

  (1)呼叫物件的hashCode()方法,獲得要儲存元素的雜湊值。

hashMap.put("abc");//-----------------------new String("abc").hashCode()=96354

  (2)將雜湊值與表的長度(即陣列的長度)進行求餘運算得到一個整數值,該值就是新元素要存放的位置(即是索引值)。

  如果索引值對應的位置上沒有儲存任何元素,則直接將元素儲存到該位置上。

  如果索引值對應的位置上已經儲存了元素,則執行第3步。


  (3)遍歷該位置上的所有舊元素,依次比較每個舊元素的雜湊值和新元素的雜湊值是否相同。

  如果有雜湊值相同的舊元素,則執行第4步。

  如果沒有雜湊值相同的舊元素,則執行第5步。

  (4)新元素呼叫equals方法與舊元素比較內容是否相同。

  如果返回true,用新的元素替換老的元素,停止比較。

  如果返回false,則回到第3步繼續遍歷下一個舊元素。

  (5)說明沒有重複,則將新元素存放到該位置上並讓新元素記住之前該位置的元素。