? ?1、 數組(Arrary)
? ? ? ? ? ? ? ? 數組是一種線性結構的數據,連續的存儲空間和相同的類型數據。查詢速度快,但是數組的容量固定,無法擴容,只能存儲同類型的數據,對于添加和刪除元素比較慢
? ? ? ? 2、棧(Stark)
? ? ? ? ? ? ? ? 棧是一種先進后出的一種結構,好比水桶。例如虛擬機棧,方法棧等
? ? ? ? 3、鏈表(Linked List)
? ? ? ? ? ? ? ? 鏈表是一種線性的鏈式結構,鏈表的內存不是連續的,前一個節點存儲的地址不一定就是一個元素,可能是一個引用,通過這個引用可以拿到對應的對象。鏈表是通過一個節點指向另一個節點的地址將元素串起來。
? ? ? ? ? ? ? ? 單向鏈表:最簡單的鏈表格式。鏈表的最小單元為節點,每一個節點包含了數據和指向下一個節點的指針。
? ? ? ? ? ? ? ? 雙向鏈表:兩個方向的鏈表。鏈表的每個節點包含了數據以及前一個節點地址的指針和后一個節點的地址指針。這種數據結構的好處是通過當前節點可以通過時間復雜度o(1)很快定位到前置節點和后置節點,但是通過前置指針和后置指針的配置增加了內存的消耗。
? ? ? ? ? ? ? ? 循環鏈表:跟雙向列表差不多,但是唯一的區別就是尾節點的后置指針指向頭節點,頭節點也有指針指向了尾節點。
? ? ? ? 3、哈希(Hash)
? ? ? ? ? ? ? ? 哈希也叫做散列。通過key-vlue的方式存儲,在很大程度上提高了數據的查詢,增加和刪除。hash結合數組和鏈表的特性(數組查詢快,鏈表增刪快)。
? ? ? ? ? ? ? ? Java最經典的HashMap的底層實現是數組+鏈表+紅黑樹
? ? ? ? ? ? ? ? hash函數在hash表中起到至關重要作用,數據通過hash函數生成一個固定的hash值,通過hash值可以很快的定位到元素。但是hash值不是唯一的,就將hash值相同的放入鏈表中,如果鏈表的長度超過8,或者大小超過64,就將鏈表轉化為紅黑樹。
? ? ? ? 4、隊列(Queue)
? ? ? ? ? ? ? ? 隊列是特殊的線性結構,一種先進先出的數據存儲結構,數據的刪除操作只能在頭部操作,插入在尾部操作。
? ? ? ? 5、樹(Tree)
? ? ? ? ? ? ? ? 樹是一種線性結構,有節點組成的集合。
? ? ? ? ? ? ? ? 二叉樹:每一個節點最多有兩個子樹
? ? ? ? ? ? ? ? 完全二叉樹:除了最外層節點,其他的節點都達到最大的層數
? ? ? ? ? ? ? ? 滿二叉樹:一個樹的節點要么是葉子節點,要么就是有兩個節點
? ? ? ? ? ? ? ? 平衡二叉樹:任何節點的子樹高度差不超過1;
? ? ? ? ? ? ? ? 二叉查找樹:任意節點的左子樹都不能為空,并且左子樹所有節點的值都小于根節點;任意節點的右子樹不能為空,并且右子樹所有節點的值都大于根節點;任意節點的左右子樹都是一個二叉查找樹。
? ? ? ? ? ? ? ? B樹:一種堆讀寫優化的自平衡二叉樹,在數據庫索引的常用索引數據的結構。
? ? ? ? ? ? ? ? B+樹:所有非葉子節點都是索引部分,節點中僅包含根節點的最大或者最小的關鍵字;所有葉子節點包含了所有關鍵字的信息以及含有這些關鍵字記錄的指針,而且葉子節點數據根據關鍵節點的大小從小到大排列;m個子樹的中間節點包含有m個元素,每個元素不包含數據,只包含索引。
? ? ? ? ? ? ? ? 紅黑樹
? ? ? ? ? ? ? ? 紅黑樹是一種平衡二叉樹,通過顏色約束樹的平衡。每一個元素要么紅色,要么黑色;根節點一定是黑色;每個葉子節點都是黑色的;如果一個節點為紅色,那么他的所有子節點都是黑色,因為每一條路徑上都不能出現相鄰兩個節點是同一顏色;每一個葉子節點的所有路徑存在的黑色節點都相同。
? ? ? ? 6、堆(Heap)
? ? ? ? ? ? ? ? 堆是一種特殊的樹形結構,父節點的值大于等于子節點的值或者小于子節點的值。對于max heap根節點是所有節點的最大值 或者min heap根節點值是所有節點最小的值。
? ? ? ? 7、圖(Graph)
? ? ? ? ? ? ? ? 一個圖就是一些頂點的集合,這些頂點通過一系列邊結對(連接)。頂點用圓圈表示,邊就是這些圓圈之間的連線。頂點之間通過邊連接。
? ? ? ? ? ? ? ? 節點之間的關系是任意的,圖中任意兩個數據元素之間都有可能相關。