今天不學習,明天變垃圾
鏈表又分爲單鏈表和雙向鏈表,與順序表的區別是:鏈表是用一組任意的存儲單元來存儲數據,這些存儲單元在物理上可以是連續的,也可以是不連續的。
單鏈表節點中除了保存數據外,還保存下一個節點對象引用,如果它有下一個節點的話。這樣每個節點之間形成一種邏輯上的線性結構,儘管每個節點之間的存儲位置不連續。下面通過分析 HashMap,來學習單鏈表是怎麼工作的。
HashMap
-
HashMap 內部使用數組+單鏈表數據結構來保存數據。下面是HashMap 一些基本內容。
HashMap 類結構
HashMap 靜態內部類 Node
-
HashMap 數組擴容
1、如果數組已經初始化,並且當前節點數組容量大於或等於最大容量(爲1 << 30),擴容閾值變成Integer.MAX_VALUE,該值遠遠大於最大容量,就不會再觸發擴容請求。
2、如果數組已經初始化,且當前長度小於最大長度時,把當前數組長度擴大兩倍,擴大兩倍後的長度如果小於最大長度,把擴容閾值也擴大兩倍。有一種特殊情況就是把當前數組長度擴大兩倍後大於最大長度的時候?3、如果數組沒有初始化,其閾值大於0的話,初始化一個長度爲閾值的數組。否則初始化一個默認長度爲16的數組。
4、針對第2步特殊情況:如果把當前數組擴大兩倍後大於最大長度,則把擴容閾值擴大到 Integer.MAX_VALUE。比如說自己定義閾值,然後根據閾值去初始化數組的時候。
5、數組擴容後,需要把原來數組的數據循環遍歷賦值到新數組中。由於 HashMap 的存儲結構是數組中保存單鏈表的形式,因此數組的遍歷時,也需要對數組內的單鏈表進行遍歷查找每一個節點。
-
HashMap 增刪改查
-
增。
1、查看數組是否初始化,否則初始化一個默認長度的數組。 2、查看插入位置是否存在節點,沒有則直接新建節點保存。
3、當插入位置已存在鏈表時,首先判斷首節點是否相等;
4、遍歷所有節點,找到相同節點後跳出循環。或者遍歷完所有節點後,沒有發現相同的節點,則在鏈表尾節點插入該新節點,接着跳出循環。
5、上述兩步找到相同節點後,默認更新節點中數據。 -
刪。
1、首先和單鏈表首節點判斷是否相等,如果單鏈表存在的話。
2、循環遍歷單鏈表,找出待刪除節點和它前一個節點。3、如果待刪除節點爲首節點,則把數組中保存的節點替換成它的下一個節點。
4、否則把待刪除節點的前一個節點的 next 值指向它的 next 值,這樣就相當於它被孤立,虛擬機就有機會把該節點回收。 -
改。
先根據key查找節點,查找到節點後替換節點中的值。
-
查。
1、爲了提高效率,總是先檢查首節點是否相等。
2、遍歷單鏈表查找。
-
單鏈表知識總結