關於HashMap的學習記錄

2021-10-14 15:10:19 字數 2298 閱讀 2984

目錄

1.說說你對hash演算法的理解。追問:hash演算法任意長度的輸入 轉化為了 固定長度的輸出,會不會有問題呢?追問:hash衝突能避免麼?

2.你認為好的hash演算法,應該考慮點有哪些呢?

3.hashmap中儲存資料的結構是什麼樣的呢?

4.建立hashmap時,不指定雜湊表陣列長度,初始長度是多少呢?追問:雜湊表是new hashmap() 時建立的麼?

5.預設負載因子是多少呢,並且這個負載因子有什麼作用?

6.鍊錶轉化為紅黑樹,需要達到什麼條件呢?

7.node物件內部的hash欄位,這個hash值是key物件的hashcode()返回值麼?追問:這個hash值是怎麼得到呢?追問:hash欄位為什麼採用高低位異或?

8.hashmap put 寫資料的具體流程,盡可能的詳細點!

9.紅黑樹的寫入操作,是怎麼找到父節點的,找父節點流程?

10.treenode資料結構,簡單說下。

11.紅黑樹的原則有哪些呢?

12.jdk8 hashmap為什麼引入紅黑樹?解決什麼問題?追問:為什麼hash衝突後效能變低了?

13.hashmap 什麼情況下會觸發擴容呢?追問:觸發擴容後,會擴容多大呢?演算法是什麼?追問:為什麼採用位移運算,不是直接*2?

14.hashmap擴容後,老表的資料怎麼遷移到擴容後的表的呢?

15.hashmap擴容後,遷移資料發現該slot是顆紅黑樹,怎麼處理呢?

16.為什麼hashmap大小要為2的冪次方數

hash演算法基本概念就是將任意長度的輸入,對映轉換為固定長度的輸出。會。hash衝突只能盡量避免。

1.不可逆。得到的hash值不能逆推得到原文

2.盡可能分散,分布均勻

3.兩個輸入,只要有一點不同,得到的hash值也不同

4.效率高,要做到長文字也要快速高效輸出hash值

jdk7 以前是 陣列 + 鍊錶。 jdk8 是 陣列 + 鍊錶 + 紅黑樹。

jdk8 每個資料單元都是乙個node結構,其中node結構包括 key,value,hash,next四個字段。next 型別為node,用於hash衝突形成鍊錶的時候存放下乙個node

初始長度:16。雜湊表採用的是懶載入機制,建構函式中沒有傳參的時候,只有第一次put值的時候才進行初始化。

0.75f。用於計算擴容。例如預設情況下擴容邊界為:16 * 0.75 = 12

1. 桶位hash衝突形成的鍊錶長度大於8

2.雜湊表table長度大於64

不是,是key.hashcode()的高低位異或得到。目的是為了讓高位參與運算,避免高位浪費

public final int hashcode()
key經過定址運算之後得到桶位的位置後,

1.桶位為空,直接放進去

2.桶位不為空,如果沒有hash衝突,替換值

3.桶位不為空,hash衝突,鍊錶的情況,遍歷鍊錶,遇到相同的就替換,沒有則放在鍊錶尾部(尾插法)

4.桶位不為空,hash衝突,紅黑樹 // todo

put完成之後,如果元素個數大於擴容閾值時進行擴容

當雜湊表hash衝突形成鍊錶十分嚴重,這時候的查詢效率又會大大降低,在時間與空間的權衡之下,紅黑樹已空間換時間的方式來提高查詢效率。

理想情況下雜湊表查詢效率為o(1) 鍊錶 o(n) 紅黑樹o(logn)

例如 預設情況下,當元素個數大於 16 * 0.75 = 12 之後會進行擴容。

每次擴容都是之前的兩倍,newcap = oldcap << 1。表大小左移一位

因為雜湊表大小為2的冪次方數,而位移運算高效快速,計算機底層沒有乘法操作

1.桶位null

2.桶位只有乙個元素,將元素key的hash值與擴容後的大小-1,e.hash & (newcap - 1)

3.桶位為鍊錶,會拆分成高低位鏈,低位鏈的資料跟老表中的位置一樣,高位鏈的位置需要加上老表的長度

假如原煉表上的2個二進位制數分別為:....1 0011,....0 0011,原表大小16,二進位制為...1 0000,

....1 0011 & ....1 0000 = ....1 0000 高位結果為1.移入高位鏈中,即該元素在新錶的位置在老表的位置 + 老表的長度

....0 0011 & ....1 0000 = ....0 0000 高位結果為0.移入低位鏈中,即該元素在新錶的位置與在老表位置一致

4.桶位為紅黑樹

乙個key的hashcode是乙個int整數,而int在記憶體中是以二進位制數儲存,位運算比運算子運算更高效。當長度為2的冪次方數時,hash & (length -1) = hash % length

HashMap學習記錄

hashmap繼承abstractmap,實現轉殖,序列化介面 public class hashmapextends abstractmapimplements map,cloneable,serializable public final k getkey public final v getv...

關於hashmap的實現原理的學習

hashmap是由乙個entry陣列及鍊錶實現的,當使用put key,value 將鍵值對儲存到map中時,首先會呼叫hashcode 方法獲取hashcode,並對陣列長度取餘找到在陣列上的儲存位置,然後判斷該位置上上是否有元素,沒有的話建立entry物件存入該位置,有的話先判斷該位置的鍊錶有沒...

關於Git GitHub的學習記錄

1 大部分操作在本地完成,不需要聯網 2 完整性保證 3 盡可能新增資料而不是刪除或修改資料 4 分支操作非常快捷流暢 5 與 linux 命令全面相容 按照下圖步驟安裝 我都計算機是win10 64位的 步驟1步驟2 步驟3步驟4 步驟5步驟6 步驟7步驟8 end到這裡安裝結束 分為工作區 寫 ...