資料結構歸納整理版1.0
寫在前面的話:
每次面試基本逃脫不了java基礎 資料結構 而我本人基礎又不牢固 生背下來了人家一深問就露餡了 所以花時間多看了一下資料結構知識
資料結構的基本分類
線性結構
-
陣列
元素在記憶體中線性連續儲存,可以根據下標快速訪問陣列元素,查詢的效率高(O(1)),但是增刪效率不是很高,每一次增加或刪除元素都需要
大量移動元素空出插入位置或者填補刪除元素的位置(複雜度是O(n))。 適用場景:頻繁查詢 很少進行增刪改的場景;
陣列的訪問通過索引完成,即:“陣列名稱[索引]”,但是需要注意的是,陣列的索引從0開始,所以索引的範圍就是0 ~ 陣列長度-1,例如開闢了3個空間的陣列,所以可以使用的索引是:0,1,2,如果此時訪問的時候超過了陣列的索引範圍,會產生java.lang.ArrayIndexOutOfBoundsException 異常資訊;
陣列本身是一個有序而且有限的資料集合 所以採用for迴圈的方式進行遍歷操作,
-
連結串列:
儲存可以不連貫,根據索引將資料聯絡起來,當查詢元素的時候需要從開頭開始去查詢複雜度O(n),所以效率比較低,然而增加或刪除元素的時候只需要修改索引(複雜度O(1))就可以了。適用場景:少查詢,需要頻繁插入或刪除的情況;
連結串列的實現原理
- 建立一個節點類,其中節點類包含兩個部分,第一個是資料域(你到時候要往節點裡面儲存的資訊),第二個是引用域(相當於指標,單向連結串列有一個指標,指向下一個節點;雙向連結串列有兩個指標,分別指向下一個和上一個節點)
- 建立一個連結串列類,其中連結串列類包含三個屬性:頭結點、尾節點和大小,方法包含新增、刪除、插入等等方法。
通過雜湊函式計算出實際儲存地址,然後從陣列中對應地址取出即可。當我們對某個元素進行雜湊運算,得到一個儲存地址,然後要進行插入的時候,發現已經被其他元素佔用了,其實這就是所謂的雜湊衝突,也叫雜湊碰撞。
HashMap由陣列+連結串列組成的,陣列是HashMap的主體,連結串列則是主要為了解決雜湊衝突而存在的,如果定位到的陣列位置不含連結串列(當前entry的next指向null),那麼查詢,新增等操作很快,僅需一次定址即可;
如果定位到的陣列包含連結串列,對於新增操作,其時間複雜度為O(n),首先遍歷連結串列,存在即覆蓋,否則新增;對於查詢操作來講,仍需遍歷連結串列,然後通過key物件的equals方法逐一比對查詢。所以,效能考慮,HashMap中的連結串列出現越少,效能才會越好
HashMap put方法邏輯圖(JDK1.8)
- 佇列:
特點:先進先出(FIFO/fisrt in first out),如同一個單向隧道,先進的車先出 使用場景:多執行緒的阻塞佇列管理非常有用
- 棧:
特點:後進先出(LIFO/last in first out),就像一個箱子,先放進去的東西在底部,需要先拿出上面的東西,下面的東西才能拿出來
參考部落格來源:https://blog.csdn.net/woshimaxiao1/article/details/83661464