常見數據結構在內存中是怎麼存儲的

前言:

在開發中,經常用到數組,ArrayList,HashMap等,他們在內存中是怎麼存儲的呢?
其實在他們在申請內存時,要麼是一塊連續的內存,要麼是分散的,要麼是內存和連續的結合使用。說白了在底層存儲結構只有兩種:數組和鏈表;
數組是連續的,只要知道了首地址,就可以通過步長訪問數組內所有的值,如果arraylist是基於數組的。
鏈表是分散的,每個位置除了包含值還會包含下一項的指針,雙向鏈表會前後兩項的指針。

ArrayList

ArrayList底層是基於數組存儲的,相對於數組,arraylist可以動態擴容(使用數組時,在定義時,需要指定長度,但arrayList不需要)。
所以arrayList中存儲是連續的,查詢會很方便。但刪除插入時,除非是尾部,否則都會涉及到其他位置的重新賦值,影響效率。
ArrayList的動態擴容,定義arraylist時,如果沒有定義長度,默認的長度是10 可能不同換jdk有不同的實現,當需要擴容時,會申請一塊原size 1.5倍的內存塊(new_size=old_size+old_size>>1),然後將原內存塊中的內容複製到新的內存塊中。原內存塊清空,從而實現擴容。

LinkedList

 linkedList 底層是基於 鏈表的,每個結點,都會有前一個和下一個的指針,插入刪除,也只需要改變指針指向的位置就可以了。

hashMap

 hashmap 是基於數組和鏈表的,hashMap 默認申請大小爲16 的數組,當存儲時,根據key的hashCode,決定存儲在數組中的第幾個索引,如果該索引已經存儲了其他元素,剛判斷兩個key是否相等,如果相等,剛覆蓋,否則存儲在該索引處的鏈表中。
 hashMap擴容時,也需要重新申請一塊連續的內存,將原內存塊內容複製到新的內存塊中,但是個索引處的鏈表節點,不需要重新創建。
 hashMap 擴容機制:默認長度是16 如果需要擴容則擴爲原來的2倍。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章