三分鐘快速記憶(一) 簡單理解Hashmap的原理

2021-09-18 04:04:25 字數 1641 閱讀 6070

在我們學習資料結構的過程中會理解很多的演算法結構,比如說list、link、map等等。這些資料結構都是非常常見的結構,那麼反問一下,為什麼要發明這些資料結構呢?理由很簡單,我們的所有目前的計算機記憶體都是有限的,那麼我們要更好的利用這些記憶體,得到合理化最大化的利用肯定少不了巧妙的演算法設計。所以很簡單,如果我們能夠學好資料結構會給我們的程式效能優化帶來飛一樣的進步。當然最難和最需要思維的就是資料結構,努力攻破演算法就是勝利。加油吧少年們!!!!fight!!!

首先我們都知道hashmap 是乙個雜湊表,它儲存的方式是key-value的形式,它是由陣列和鍊錶組成的特殊的儲存結構。這時候你會問,為什麼需要陣列和鍊錶組成?我們都知道資料量一旦大的時候,我們總是希望能夠在查詢的時候一時間就能夠鎖定我們想要查詢的值,這樣能夠大量的減少我們的查詢時間,所以hashmap結構就誕生了。我們都知道陣列是順序儲存的,它的查詢的時間複雜度是o(1),鍊錶的查詢資料的時間複雜度是o(n),那麼hashmap查詢時間複雜度到底是怎麼樣的呢???其實在這裡,我們不考慮鍊錶的查詢複雜度o(n),說hashmap的查詢複雜度是o(1)其實也是能夠說得通的。

為什麼這麼說呢?如圖所示

這個是我簡單做的乙個促進理解的。可以看到hashmap的儲存結構,現在如果我們如果建乙個長度為5的陣列,鍊錶長度為20。那麼如果存在1-100的順序資料,雜湊資料進hashmap結構中,它們的每乙個位置都應該是明確的,比如說30應該在陣列第二個空間裡的第10個位置,55應該在陣列第三個空間裡的第15個位置等等。因為我們在進行陣列雜湊的過程中根據資料的大小進行雜湊,它們每個資料在陣列裡位置會被雜湊出乙個雜湊碼,這個雜湊碼是用來記住它陣列的位置。同時根據hashmap中的key算出索引,索引獲得索引位置所對應的鍵值對鍊錶,遍歷鍵值對鍊錶,根據key找到對應的entry鍵值對,最後拿到value值。

現在明白為什麼是近似o(1)了吧,就是在hashmap中已經歸類好每乙個空間的可取值範圍了,這樣根據它的雜湊碼和索引值直接可以定位它的位置了,何嘗不是o(1)級別的呢。

那麼hashmap增刪改查複雜度如此之低,是不是大家都可以在任何場合都可以用它了呢?首先我們知道hashmap的會根據一定的條件進行陣列分割,讓資料根據自己的索引進入鍊錶中,適用場景比如說註冊賬號資訊等,這些少量不需要總是修改和新增的,多讀少加的可以考慮使用hashmap。

同時, hashmap可以接受null鍵值,hashmap是非synchronized。

基於雜湊原理,我們通過put()和get()方法儲存和獲取物件。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashcode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。hashmap使用linkedlist來解決碰撞問題,當發生碰撞了,物件將會儲存在linkedlist的下乙個節點中。 hashmap在每個linkedlist節點中儲存鍵值對物件。

當兩個不同的鍵物件的hashcode相同時會發生什麼? 它們會儲存在同乙個bucket位置的linkedlist中。鍵物件的equals()方法用來找到鍵值是否符合要求。

三分鐘理解Python lambda

這篇主要是複習一下 lambda表示式是一種匿名函式,對應python中的自定義函式def。定義func函式,計算給定數x的平方 def func x return x x 等價於 func lambda x x x 用法,他就是乙個函式,像正常函式那樣呼叫就好 func 6 可以看到,lambda...

《三分鐘理解大小端》

無論筆試還是面試都有一定機率問怎麼判斷大小端,那麼你就很自豪的回答,大端就是資料高位元組放在低位址上,小端就是資料低位元組放在低位址上。好了您回答了這個恭喜下面讓你 實現一下,這個時候很多只是死記硬背的缺陷就會暴露出來。其實 的實現很多方法都是可以的,下面舉例最簡單的一種,就是初始化乙個16進製制的...

三分鐘理解依賴注入

如果在 class a 中,有 class b 的例項,則稱 class a 對 class b 有乙個依賴。例如下面類 human 中用到乙個 father 物件,我們就說類 human 對類 father 有乙個依賴。public class hunman 仔細看這段 我們會發現存在一些問題 1...