hashMap的數據結構
在jdk8中,HashMap是用了數組和鏈表以及紅黑樹這三種數據結構
首先,在hashmap類中,都有一個table數組,我們在存儲數據時,對這個數據的hash值進行一系列的計算 計算出它在Table中的位置(下標),並將它存放進去
然而,我們在hashmap是什麼中提到,不同的對象的Hash值可能相同,那麼相同的Hash值會導致不同的數據在數組中有相同的存儲位置,我們雖然創造了一系列的解決辦法,但並不能完全的避免這種衝突,那麼,當產生衝突時,hashmap是怎樣解決的呢?
當產生衝突時,如data1和data2 ,我們把data2放在data1後的列表中,這樣就不會因為哈希值的衝突而對數據產生影響。
1.時間複雜度
我們知道,當某條鏈表的長度大於8時,就會將其轉換為紅黑樹。遍歷一條鏈表的時間複雜度O(n),當一條鏈表過長時,遍歷這條鏈表可能會花很長時間,而遍歷一顆紅黑樹的時間複雜度為O(logn),從而減少了插入或查找的時間
2.紅黑樹
簡單總結下紅黑樹是什麼:一種二叉查找樹,但在每個結點上增加一個存儲位表示結點的顏色,可以是Red或Black。通過對任何一條從根到葉子的路徑上各個結點著色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出倆倍,因而是接近平衡的。
也就是說,紅黑樹是一種相對平衡的查找二叉樹,這使他不僅便於查找,也便於插入和刪除,這對於既需要插入也需要查找的HashMap是非常有利的
下一節:數據哈希值的計算和在table中的存儲位置
相關推薦
'京東算法工程師分享—最全面的算法和數據結構知識(附帶學習資料'
"數據結構鏈表鏈表是一種由節點(Node)組成的線性數據集合,每個節點通過指針指向下一個節點。它是一種由節點組成,並能用於表示序列的數據結構。單鏈表:每個節點僅指向下一個節點,最後一個節點指向空(null)。雙鏈表:每個節點有兩個指針p,n。p指向前一個節點,n指向下一個節...
'面試季馬上就要到了,數據結構和算法你都掌握了嗎'
"什麼是數據結構?簡單說,數據結構就是一個容器,以某種特定的佈局存儲數據。這個“佈局”使得數據結構在某些操作上非常高效,在另一些操作上則不那麼高效。你的目標就是理解數據結構,這樣就能為手頭的問題選擇最優的數據結構。為什麼我們需要數據結構?由於數據結構用來以有組織的形式存儲數...
'學好這13種數據結構,應對各種編程語言(C++版)'
"學了這麼長時間數據結構和算法,有必要來個總結了,順便回顧一下我們這段時間的學習成果。以 C++ 語言本身提供的數據結構為例。如果能掌握這 13 種數據結構,相信在學習其它語言的時候就不費勁了。數組 Array數組在初始化的時候就需要知道其大小,後續是不可以改變其大小的,可...
'阿里算法工程!史上最全面的算法和數據結構知識'
"鏈表鏈表是一種由節點(Node)組成的線性數據集合,每個節點通過指針指向下一個節點。它是一種由節點組成,並能用於表示序列的數據結構。單鏈表:每個節點僅指向下一個節點,最後一個節點指向空(null)。雙鏈表:每個節點有兩個指針p,n。p指向前一個節點,n指向下一個節點;最後...
'阿里算法工程分享!史上最全面的算法和數據結構知識'
"鏈表鏈表是一種由節點(Node)組成的線性數據集合,每個節點通過指針指向下一個節點。它是一種由節點組成,並能用於表示序列的數據結構。單鏈表:每個節點僅指向下一個節點,最後一個節點指向空(null)。雙鏈表:每個節點有兩個指針p,n。p指向前一個節點,n指向下一個節點;最後...
'「數據結構」線段樹(Segment Tree)'
"假設我們現在拿到了一個非常大的數組,對於這個數組裡面的數字要反覆不斷地做兩個操作。1、(query)隨機在這個數組中選一個區間,求出這個區間所有數的和。2、(update)不斷地隨機修改這個數組中的某一個值。時間複雜度:枚舉:枚舉L~R的每個數並累加。query:O(n)...
'GitHub Python項目推薦|數據結構和算法必知必會的50個代碼實現'
"GitHub Python項目推薦|數據結構和算法必知必會的50個代碼實現項目熱度標星(star):8860關注(watch):486拷貝(fork):2644貢獻人數:98 (貢獻人數很多哈)倉庫大小:1 MB最後更新:2019-08-17代碼提交活躍:開發語言主要語言...
'阿里面試官:HashMap數據結構之道'
"問題1:HashMap的數據結構是什麼樣的?同學1:嗯...數組+鏈表同學2:數組+鏈表...同學3:數組+鏈表...同學4:數組+鏈表+紅黑樹...同學n:..... 為什麼答案會有兩種?難道大家學習的HashMap有兩個版本?我突然想起馬克思哲學裡面的一句話,真理是相...
'騰訊算法工程師分享—最全面的算法和數據結構知識(附帶學習資料'
"數據結構鏈表鏈表是一種由節點(Node)組成的線性數據集合,每個節點通過指針指向下一個節點。它是一種由節點組成,並能用於表示序列的數據結構。單鏈表:每個節點僅指向下一個節點,最後一個節點指向空(null)。雙鏈表:每個節點有兩個指針p,n。p指向前一個節點,n指向下一個節...
'Java教程之Java數據結構的學習方法分享'
"Java數據結構是所有Java開發工程師在日常工作中不可缺少的,尤其是我們在處理數據中經常會用到數據結構,這麼重要的知識點很多初學者在學習Java數據結構時不知道該如何學習?下面千鋒武漢Java培訓小編就為大家分享Java數據結構學習方法。Java的工具包提供了非常強大的...
'阿里工程師分享,是你見過最全面的算法和數據結構知識'
"鏈表鏈表是一種由節點(Node)組成的線性數據集合,每個節點通過指針指向下一個節點。它是一種由節點組成,並能用於表示序列的數據結構。單鏈表:每個節點僅指向下一個節點,最後一個節點指向空(null)。雙鏈表:每個節點有兩個指針p,n。p指向前一個節點,n指向下一個節點;最後...
推薦中...