hashmap value占用空间大小_HashMap的put和get实现原理及源码分析
生活随笔
收集整理的這篇文章主要介紹了
hashmap value占用空间大小_HashMap的put和get实现原理及源码分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
水平有限,難免會有疏漏之處,如有錯誤,還請指出,感謝!
第二步:通過哈希算法計算出當前key的hash值
第三步:再通過哈希表函數/哈希算法,將hash值轉換成數組的下標,下標位置上如果沒有任何元素,就把Node添加到這個位置上。
如果說下標對應的位置上有鏈表。此時,就會拿著k和鏈表上每個節點的k進行equal。
如果所有的equals方法返回都是false,那么這個新的節點將被添加到鏈表的末
尾。如其中有一個equals返回了true,那么這個節點的value將會被覆蓋。// 存儲時: // 這個hashCode方法這里不詳述,只要理解每個key的hash是一個固定的int值即可 int hash = key.hashCode(); int index = hash % Entry[].length; Entry[index] = value;
第二步:通過上一步哈希算法轉換成數組的下標之后,在通過數組下標快速定位到某個位置上。
重點理解
如果這個位置上什么都沒有,則返回null。
如果這個位置上有單向鏈表,那么它就會拿著參數K和單向鏈表上的每一個節點的K進行equals,如果所有equals方法都返回false,則get方法返回null。
如果其中一個節點的K和參數K進行equals返回true,那么此時該節點的value就是我們要找的value了,get方法最終返回這個要找的value。
前言
HashMa是Java中最常用的集合類框架,也是Java語言中非常典型的數據結構,同時也是我們需要掌握的數據結構,更重要的是進大廠面試必問之一。
數組特點
- 存儲區間是連續,且占用內存嚴重,空間復雜也很大,時間復雜為O(1)。
- 優點:是隨機讀取效率很高,原因數組是連續(隨機訪問性強,查找速度快)。
- 缺點:插入和刪除數據效率低,因插入數據,這個位置后面的數據在內存中要往后移的,且大小固定不易動態擴展。
鏈表特點
- 區間離散,占用內存寬松,空間復雜度小,時間復雜度O(N)。
- 優點:插入刪除速度快,內存利用率高,沒有大小固定,擴展靈活。
- 缺點:不能隨機查找,每次都是從第一個開始遍歷(查詢效率低)。
哈希表特點
以上數組和鏈表,大家都知道各自優缺點。那么我們能不能把以上兩種結合一起使用,從而實現查詢效率高和插入刪除效率也高的數據結構呢?答案是可以滴,那就是哈希表可以滿足,接下來我們一起復習HashMap中的put()和get()方法實現原理。
HashMap的put()和get()的實現
1、map.put(k,v)實現原理
第一步:首先將k,v封裝到Node對象當中(節點)第二步:通過哈希算法計算出當前key的hash值
第三步:再通過哈希表函數/哈希算法,將hash值轉換成數組的下標,下標位置上如果沒有任何元素,就把Node添加到這個位置上。
如果說下標對應的位置上有鏈表。此時,就會拿著k和鏈表上每個節點的k進行equal。
如果所有的equals方法返回都是false,那么這個新的節點將被添加到鏈表的末
尾。如其中有一個equals返回了true,那么這個節點的value將會被覆蓋。// 存儲時: // 這個hashCode方法這里不詳述,只要理解每個key的hash是一個固定的int值即可 int hash = key.hashCode(); int index = hash % Entry[].length; Entry[index] = value;
2、map.get(k)實現原理
//數組長度減1與運算hash值 first = tab[(n - 1) & hash]第一步:先調用k的hashCode()方法得出哈希值,并通過哈希算法轉換成數組的下標。第二步:通過上一步哈希算法轉換成數組的下標之后,在通過數組下標快速定位到某個位置上。
重點理解
如果這個位置上什么都沒有,則返回null。
如果這個位置上有單向鏈表,那么它就會拿著參數K和單向鏈表上的每一個節點的K進行equals,如果所有equals方法都返回false,則get方法返回null。
如果其中一個節點的K和參數K進行equals返回true,那么此時該節點的value就是我們要找的value了,get方法最終返回這個要找的value。
3、為何隨機增刪、查詢效率都很高的原因是?
原因:增刪是在鏈表上完成的,而查詢只需掃描部分,則效率高。HashMap集合的key,會先后調用兩個方法,hashCode and equals方法,這兩個方法都需要重寫。
4、為什么放在hashMap集合key部分的元素需要重寫equals方法?
因為equals默認比較是兩個對象內存地址5、HashMap總結
- 無序,不可重復
- 因為不一定掛到哪一個單向鏈表上的,因此加入順序和取出也不一樣。
- 使用equals方法來保證HashMap集合key不可重復,如key重復來,value就會覆蓋。存放在HashMap集合key部分的元素,其實就是存放在HashSet集合中,則HashSet集合也需要重寫equals和hashCode方法。
- hashmap集合的默認初始化容量為16,默認加載因子為0.75,也就是說這個默認加載因子是當hashMap集合底層數組的容量達到75%時,數組就開始擴容。
- hashmap集合初始化容量是2的陪數,為了達到散列均勻,提高hashmap集合的存取效率,
6、注意JDK8之后
JDK8之后,如果哈希表單向鏈表中元素超過8個,那么單向鏈表這種數據結構會變成紅黑樹數據結構。當紅黑樹上的節點數量小于6個,會重新把紅黑樹變成單向鏈表數據結構,官方源碼如下圖。
問題:
如果O1和O2的hash值相同,就會存放到同一個單向鏈表上,
如果不同,但由于哈希算法執行結束之后轉換的數組下標可能相同,此時會發上“哈希碰撞”。
HashMap的存取是采用什么算法實現?
// 存儲時: // 這個hashCode方法這里不詳述,只要理解每個key的hash是一個固定的int值即可 int hash = key.hashCode(); int index = hash % Entry[].length; Entry[index] = value;// 取值時: int hash = key.hashCode(); int index = hash % Entry[].length; return Entry[index];7、高頻面試題
- HashMap的工作原理是什么?
- HashMap中的“死鎖”是怎么回事?
- HashMap中能put兩個相同key嗎?為什么?
- HashMap中的鍵值可以為空嗎?原理?
- HashMap擴容機制?
另,如果覺得這本篇文章寫得不錯,有點東西的話,記得來個三連【點贊+關注+分享】。
需要大數據、Java、redis、Dubbo框架等教程,關注微信公眾號:自學大數據踩的抗 【回復相關術語】
總結
以上是生活随笔為你收集整理的hashmap value占用空间大小_HashMap的put和get实现原理及源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信还信用卡支付失败退款要多久
- 下一篇: 微信钱包还信用卡限额标准/多少