hashMap簡單認識

2021-09-27 11:22:20 字數 1997 閱讀 5802

1. hashmap簡單認識

優點:hashmap的儲存方式是鍵值對(鍵可以包括null),查詢速度,儲存方便,儲存數量最大為十幾億。

缺點:主要是執行緒不安全,容易在hashmap擴容時形成死迴圈;

2.hashmap從原始碼角度簡單認識

jdk1.7 使用的陣列 + 鍊錶

jdk1.8 使用的陣列 + 鍊錶 + 紅黑樹

分析為什麼使用陣列 + 鍊錶 + 紅黑樹:

陣列:主要是方便查詢,且在記憶體中是連續的。

鍊錶:主要是方便插入,刪除,然而hashmap把兩個者有點結合在一起。

紅黑樹:主要是jdk1.8為了對鍊錶進行優化時,增加的資料結構。那麼在它們如何使用的呢? ,可以從put()函式中看出

hashmap重要引數

loadfactor    負載因子,預設值75%

threshold    臨界值,超過臨界值需要重新分配

modcount    統計刪除和修改的次數

entry    實體類,主要有四個引數組成,分別是key,hash,value,next

hashmap的建構函式

1.無參構造

2.有參構造

分析hashmap的建構函式:

通過在平時專案觀察發現,大部分人都會使用無參的建構函式,因為會有初始值16,那麼問題來了,如果我們儲存數量大於16  呢,看過原始碼的人當然會說,需要進行擴容操作,可是資料量比較大的時候是不是申請很多記憶體空間,把乙個陣列裡面的資料重新放到另乙個陣列裡面去,這樣可能比較消耗時間和記憶體,如果在多執行緒情況下,是不是容易出現資料問題,我個人觀點,提前指定所需要的空間,那麼有人會說,我可以知道需要申請多少空間,如果盲目申請記憶體是不是也會產生浪費,這樣的觀點是沒有錯的,但是我這裡強調的是,在你大概知道需要多少資料量,應指定所需要申請的空間。

hashmap裡面的put操作

addentry函式:

createentry:

putfornullkey函式:

hashmap裡面put方法:

1.  首先初始化陣列

2.  判斷鍵是不是null,如果是null,用putfornullkey()來處理

3. 計算出雜湊值

4. 用雜湊值和陣列長度進行indexfor()運算;得到下標i;

5. 通過下標i在陣列裡面找到對應的實體類,比較實體類裡面hash值和key的==和equals方法,都相等的話,說明是要找的value

否則話,進行增加實體類

6. 在增加實體類時,都會進行判斷,是否超過threshold值,如果超過就把原來陣列的大小變為2倍。

分析put方法:

可以從原始碼和上述過程中,可以看出,在進行put操作時,首先會進行雜湊值進行比較,然後在比較key的==和equal方法,那麼在什麼時候使用equal方法呢?,其實涉及到乙個雜湊衝突的問題,就是hashcode可能存在衝突,最後會和buckindex的值一樣,在這一種情況下,會呼叫equal方法,因為equal是object方法,它直接比較的是記憶體大小。

hashmap裡面的put操作通過hashcode值可以存放資料。當不同物件的雜湊值相同時,會通過單鏈表的方式解決,將新元素插入表頭,它的next指向原來的元素。(為什麼插入表頭不插入表尾,正在研究)

分析put方法的執行緒不安全:

hashmap很容易在put操作時,形成死迴圈。

分析死迴圈形成的原因:

1. 從上述原始碼中,可以看出死迴圈的原因主要是因為在進行擴容操作所造成的。

2. 首先把原來的大小變為2倍。

3. 遍歷原來的陣列

4. 因為是單鏈表,所以要儲存下乙個節點, entrynext = e.next;

5. 因為e要插入表頭,並且需要e指向鍊錶的第乙個元素,所以需要把e.next = newtable[i];

6. 然後讓e變為陣列的頭指標。newtable[i] = e;

其實上述過程實際是單向鍊錶的反轉,在形成死迴圈時,主要是在第4 ,5 ,6步。

3.hashmap所涉及到的資料結構

1. 鍊錶

2. 雜湊運算

this簡單認識

this 在函式中簡單的說,this的指向存在於函式呼叫的時候決定的,誰呼叫了這函式 函式中的this就指向誰 例如 1 普通的呼叫函式的時候 fn window2 物件呼叫 var obj obj.f fn obj.f this obj3 定時器呼叫 因為fn不是我們自己手寫 呼叫的 底層是win...

實現簡單的HashMap

hashmap底層實現是採用了雜湊表,屬於一種基本的資料結構,而雜湊表的基本結構是 陣列 鍊錶 之前我們說到陣列和鍊錶,它們之間的優缺點如下 陣列的查詢速度快,增刪效率低 鍊錶的增刪效率高,查詢速度低 這裡我們想如何才能把這兩者的優勢集中起來呢?於是雜湊表就出來了。我們手寫乙個hashmap類來看一...

手動實現簡單HashMap。

hashmap實現方式兩種 陣列加鍊表 陣列加紅黑樹 這裡只簡單實現了第一種方式,並且未實現拓容。雜湊函式用了最簡單的取餘法。順便加上了泛型,簡單練習一下 author 馬潔 date 2019 10 26 19 32 public class link public link 插入乙個鍵值對,如果...