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 插入乙個鍵值對,如果...