Java常見的數據結構有哪些?
數據存儲的常用結構有:棧、隊列、數組、鏈表和紅黑樹
集合是基於數據結構設計的,瞭解數據結構深入瞭解集合。
隊列(queue )
- 先進先出,後進後出。
- 場景:各種排隊。
- 有很多集合可以實現隊列。
棧(stack)
- 後進先出,先進後出
- 壓棧==入棧
- 彈棧==出棧
- 例如:手槍的彈夾。
線性表(數組)
- 數組是內存中的連續存儲區域。
- 分成若干等分的小區域(每個區域大小是-一樣的)
- 元素存在索引
特點:查詢元素快(根據索引快速計算出元素的地址,然後立即去定位)
增刪元素慢(創建新數組,遷移元素)
鏈表
- 元素不是內存中的連續區域存儲。
- 元素是遊離存儲的。每個元素會記錄下個元素的地址。
- 特點:查詢元素慢
- 增刪元素快(針對於首尾元素,速度極快,Java一般是雙鏈表)
紅黑樹
二叉樹: binary tree
永遠只有一個根節點,是每個結點不超過2個節點的樹(tree)
- 查找二叉樹,排序二叉樹:
小的左邊,大的右邊,但是可能樹很高,性能變差。
爲了做排序和搜索會進行左旋和右旋實現平衡查找二叉樹,讓樹的高度差不大於1。
二叉查找樹\二叉排序樹:
二又查找樹的特點:
- 左子樹上所有的節點的值均小於等於他的根節點的值
- 右子樹上所有的節點值均大於或者等於他的根節點的值
- 每一個子節點最多有兩個子樹
缺點:如果數的大小是的遞增的,就會形成“瘸子”現象,只有“右腿”。樹的高度就會很高。
Java底層做的是平衡二叉樹
平衡二叉樹:給予查找二叉樹
爲了避免瘸子現象,平衡二叉樹:左右子樹的高度差絕對值不大於1,並且左右兩個子樹都是一顆平衡二叉樹。
當有新的數據插入二叉樹,破壞了平衡,二叉樹就要做旋轉。左邊高,右旋;右邊高,左旋;如果不行繼續旋轉;
紅黑樹(就是基於紅黑規則實現了自平衡的排序二叉樹) :
樹儘量的保證到了很矮小,但是又排好序了,性能最高的樹。
- 每一個節點或是紅色或是黑色
- 根節點必須是黑色
- 每個葉節點NIL是黑色
- 如果某個節點是紅色,它的子節點必須是黑色
- 對於每一個節點,從 該節點到其所有子節點的路徑上,黑節點的個數要一樣
做插入時,如果不滿足規則,則需要做旋轉或變色,來滿足規則