final void treeify(Node<K,V>[] tab) {
TreeNode<K,V> root = null;
//
for (TreeNode<K,V> x = this, next; x != null; x = next) {
next = (TreeNode<K,V>)x.next;
x.left = x.right = null;
//拿到根节点
if (root == null) {
x.parent = null;
x.red = false;//黑化
root = x;
}
else {
K k = x.key;//获取当前节点的key
int h = x.hash;//获取当前节点的hash
Class<?> kc = null;
for (TreeNode<K,V> p = root;;) {
//dir是插入左右节点的依据,
int dir, ph;
K pk = p.key;
//通过哈希值比较大小来确定如何分左右节点
if ((ph = p.hash) > h)
dir = -1;
else if (ph < h)
dir = 1;
//如果k的哈希值相等,则用k.compareTo()比较大小
else if ((kc == null &&
(kc = comparableClassFor(k)) == null) ||
(dir = compareComparables(kc, k, pk)) == 0)
//以上方法依然无比较出p和pk大小(即p和pk相等或无法比较)
//则用类名来比较,identityHashCode()进行比较
dir = tieBreakOrder(k, pk);
/*最终dir = 1 或 dir = -1*/
TreeNode<K,V> xp = p;
//根据dir选择左右节点,-1为插入左节点,1右节点
if ((p = (dir <= 0) ? p.left : p.right) == null) {
x.parent = xp;
if (dir <= 0)
xp.left = x;
else
xp.right = x;
root = balanceInsertion(root, x);
break;
}
}
}
}
moveRootToFront(tab, root);
}
3.2. treeify(树化) ------ HashMap 源码解析(JDK1.8)
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这篇博客主要讲解HashMap1.8的新增特性:红黑树,关于HashMap的其他内容推荐博客HashMap真的教科...
- HashMap实现原理、源码解析(jdk1.8) 下面参考博文,感谢! Java 8系列之重新认识HashMap全...