4、JAVA中HashMap和TreeMap什麼區別?低層資料結構是什麼?
1)、使用層次上的區別:
HashMap:
a)、陣列+連結串列儲存key-value,1.8加入紅黑樹(優化連結串列查詢過長的問題)
b)、允許null作為key和value,key不可以重複,value允許重複
c)、不能保證插入順序是有序的
d)、執行緒非安全
TreeMap:
a)、基於紅黑二叉樹的NavigableMap的實現
b)、不允許null,key不可以重複,value允許重複
c)、元素應當實現Comparable介面或者實現Comparator介面,元素進行自動排序
d)、執行緒非安全
2)、低層資料結構
HashMap:
a)、1.8之前陣列+連結串列,1.8加入紅黑樹
HashTree:
實現了SotredMap介面,它是有序的集合。而且是一個紅黑樹結構,每個key-value都
作為一個紅黑樹的節點。如果在呼叫TreeMap的建構函式時沒有指定比較器,則根據
key執行自然排序
總結:
紅黑樹特徵:
1、每個節點要麼是紅色,要麼是黑色;
2、根節點永遠是黑色的;
3、所有的葉節點都是是黑色的(注意這裡說葉子節點其實是上圖中的 NIL 節點);
4、每個紅色節點的兩個子節點一定都是黑色;
5、從任一節點到其子樹中每個葉子節點的路徑都包含相同數量的黑色節點;
紅黑樹左旋、右旋:
右旋——自己變為左孩子的右孩子;
左旋——自己變為右孩子的左孩子。
例:
複製程式碼
左旋:
private void rotateLeft(Entry<K,V> p) {
if (p != null) {
Entry<K,V> r = p.right; //p 是上圖中的 x,r 就是 y
p.right = r.left; //左旋後,x 的右子樹變成了 y 的左子樹 β
if (r.left != null)
r.left.parent = p; //β 確認父親為 x
r.parent = p.parent; //y 取代 x 的第一步:認 x 的父親為爹
if (p.parent == null) //要是 x 沒有父親,那 y 就是最老的根節點
root = r;
else if (p.parent.left == p) //如果 x 有父親並且是它父親的左孩子,
x 的父親現在認 y 為左孩子
p.parent.left = r;
else //如果 x 是父親的右孩子,父親就認 y 為右孩子
p.parent.right = r;
r.left = p; //y 逆襲成功,以前的爸爸 x 現在成了它的左孩子
p.parent = r;
}
複製程式碼
}