初步了解HashMap底層資料結構

2021-10-22 00:04:33 字數 2226 閱讀 2851

本文主要講述hashmap的一些簡單原理,如果講的不好,可以說出來,讓我改正本文。

說到hashmap的資料結構,就需要說到資料結構中的陣列和單鏈表結構,因為hashmap的底層就是陣列和鍊錶,不過這是jdk1.7版本的,1.8版本後加入了紅黑樹。下面先介紹一些這些資料結構。

陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o(1);陣列查詢時間複雜度o(1)是指,通過下標訪問這個下標的資料,而二分查詢時間是o(long2n),還有乙個很重要的前提條件這個陣列是要乙個有序陣列。陣列的特點是:定址容易,插入和刪除困難

鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o(n)。鍊錶的特點是:定址困難,插入和刪除容易

相比上述幾種資料結構,在雜湊表中進行新增,刪除,查詢等操作,效能十分之高,不考慮雜湊衝突的情況下(後面會**下雜湊衝突的情況),僅需一次定位即可完成,時間複雜度為o(1),接下來我們就來看看雜湊表是如何實現達到驚豔的常數階o(1)的。

我們知道,資料結構的物理儲存結構只有兩種:順序儲存結構和鏈式儲存結構(像棧,佇列,樹,圖等是從邏輯結構去抽象的,對映到記憶體中,也這兩種物理組織形式),而在上面我們提到過,在陣列中根據下標查詢某個元素,一次定位就可以達到,雜湊表利用了這種特性,雜湊表的主幹就是陣列,hashmap的就是利用了雜湊表的這種構造思想。

比如我們要新增或查詢某個元素,我們通過把當前元素的關鍵字 通過某個函式對映到陣列中的某個位置,通過陣列下標一次定位就可完成操作。

這個函式可以簡單描述為:儲存位置 = f(關鍵字),這個函式f一般稱為雜湊函式,這個函式的設計好壞會直接影響到雜湊表的優劣。

紅黑樹(red black tree) 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。在進行插入和刪除操作時通過特定操作保持二叉查詢樹的平衡,從而獲得較高的查詢效能。它的最壞情況執行時間也是非常良好的,並且在實踐中是高效的:它可以在o(log n)時間內做查詢,插入和刪除,這裡的n 是樹中元素的數目

紅黑樹有幾種特性:

jdk1.7版本的hashmap可以看作是entry陣列和鍊錶結合組成的復合結構,陣列中的每乙個儲存塊都儲存有乙個或多個entry物件,每個entry物件包含三部分key(鍵)、value(值),next(指向下乙個entry),通過雜湊值決定了entry物件在這個陣列的定址;雜湊值相同的entry物件(鍵值對),則以鍊錶形式儲存

與jdk1.7相比,jdk1.8加入了紅黑樹。為什麼加入紅黑樹?這是因為紅黑樹雖然本質上是一棵二叉查詢樹,它在二叉查詢樹的基礎上增加了著色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查詢、插入、刪除的時間複雜度最壞為o(log n)。加快檢索速率。

在jdk1.8版本的hashmap中

當單鏈表中資料的臨界值數量如果達到8以上,陣列的size小於64,就進行resize擴充套件

static

final

int treeify_threshold =8;

//鍊錶臨界值

如果資料的臨界值,如果大於8,且陣列的size是否大於64,則把對應鍊錶進行轉化為紅黑樹

static

final

int min_treeify_capacity =

64//陣列臨界值

參考文章:

如果先深入了解hasmap的原始碼下面這篇文章說的很不錯,想深入的可以看看

史上最詳細的 jdk 1.8 hashmap 原始碼解析

深入了解:hashmap的結構,1.7和1.8有哪些區別

1. 構造方法摘要

2.方法摘要

參考文章:

HashMap底層資料結構

jdk1.8之前 陣列 鍊錶 jdk1.8之後 陣列 鍊錶 紅黑樹 陣列的時間複雜度 o 1 鍊錶的時間複雜度 o n 紅黑樹時間複雜度 o logn 為什麼使用陣列?陣列的的讀 寫速度快。查詢快,增刪慢 為什麼使用鍊錶?為了避免資料的key產生雜湊碰撞後將原有的陣列下標對應的值直接替換。查詢慢,增...

回顧 HashMap的底層資料結構

假設一段 hashmap map newhashmap map.put 張三 測試資料 map.put 李四 測試資料 對張三這個key,計算出hash值,對hash值進行取模處理,定位到陣列裡的乙個元素中去 張三,測試資料 李四,測試資料 如 map.put 張三 測試資料 對 張三 這個key計...

彙編帶你深入了解String型別底層資料結構

字串作為最基礎的資料型別,在程式開發中使用最為頻繁,是每乙個程式設計師必須掌握的基礎,但是又有多少程式設計師知道它的工作原理呢?作為一名合格的程式設計師,知其然,當然也要知其所以然!一 思考 在 swift 開發使用字串的過程中,你是否有思考過以下問題?的底層儲存又會發生什麼變化?如果你能準確地回答...