栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java数据结构-HashMap详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java数据结构-HashMap详解

Java数据结构-HashMap

1. HashMap数据结构

没有哈希冲突时,为数组,支持动态扩容

哈希冲突时,分为两种情况:

1.当冲突长度小于8或数组长度小于64(MIN_TREEIFY_CAPACITY默认值为64)时,为数组+链表(Node)

2.当冲突长度大于8时,为数组+红黑树/链表(TreeNode)。

红黑树用于快速查找,链表用于遍历。

2. 红黑树

HashMap中的TreeNode是红黑树的实现。

TreeNode几个方法

1. 左旋转

static  TreeNode rotateLeft(TreeNode root,
  TreeNode p) {
      TreeNode r, pp, rl;
      if (p != null && (r = p.right) != null) {
 if ((rl = p.right = r.left) != null)
   rl.parent = p;
 if ((pp = r.parent = p.parent) == null)
   (root = r).red = false;
 else if (pp.left == p)
   pp.left = r;
 else
   pp.right = r;
 r.left = p;
 p.parent = r;
      }
      return root;
    }

实现效果如图

2. 右旋转

static  TreeNode rotateRight(TreeNode root,
   TreeNode p) {
      TreeNode l, pp, lr;
      if (p != null && (l = p.left) != null) {
 if ((lr = p.left = l.right) != null)
   lr.parent = p;
 if ((pp = l.parent = p.parent) == null)
   (root = l).red = false;
 else if (pp.right == p)
   pp.right = l;
 else
   pp.left = l;
 l.right = p;
 p.parent = l;
      }
      return root;
    }

实现效果如图

3. 插入

static  TreeNode balanceInsertion(TreeNode root,
     TreeNode x) {
      x.red = true;
      for (TreeNode xp, xpp, xppl, xppr;;) {
 if ((xp = x.parent) == null) {
   x.red = false;
   return x;
 }
 else if (!xp.red || (xpp = xp.parent) == null) //①
   return root;
 if (xp == (xppl = xpp.left)) {
   if ((xppr = xpp.right) != null && xppr.red) { //②
     xppr.red = false;
     xp.red = false;
     xpp.red = true;
     x = xpp;
   }
   else {
     if (x == xp.right) { //③
root = rotateLeft(root, x = xp);
xpp = (xp = x.parent) == null ? null : xp.parent;
     }
     if (xp != null) { //④
xp.red = false;
if (xpp != null) {
  xpp.red = true;
  root = rotateRight(root, xpp);
}
     }
   }
 }
 else {
   if (xppl != null && xppl.red) { //②
     xppl.red = false;
     xp.red = false;
     xpp.red = true;
     x = xpp;
   }
   else {
     if (x == xp.left) {    //⑤
root = rotateRight(root, x = xp);
xpp = (xp = x.parent) == null ? null : xp.parent;
     }
     if (xp != null) {  //⑥
xp.red = false;
if (xpp != null) {
  xpp.red = true;
  root = rotateLeft(root, xpp);
}
     }
   }
 }
      }
    }

实现效果如下:

以上所述是小编给大家介绍的Java数据结构-HashMap详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138725.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号