HashMap的实现原理

HashMap在JDK1.7中由数组+链表实现,初始长度为16,利用异或运算减少哈希碰撞。JDK1.8后引入红黑树,当链表长度达到8时转换为红黑树。扩容发生在数组使用达到3/4时,新数组长度为原来的2倍,并重新分布元素。HashMap非线程安全,线程安全可选ConcurrentHashMap。
摘要由CSDN通过智能技术生成

HashMap的原理在这里插入图片描述
(JDK 1.7)HashMap是由数组+链表的形式实现的,集成了数组的获取元素方便以及链表的插入元素方便的优点,初试数组长度设置的是16位。其中HashCode代表了在hash表中的位置。并且在HashMap中有一个Hash算法 (使用异或运算) 使得链表的位置在数组中尽量均匀分布,来减少 哈希碰撞 的几率。

因为计算方式使用的是位与运算,为了防止链表的位置可能多次出现在数组的第一个位置,尽量将HashMap的长度保持为2的次方数——当然在HashMap中也有相应的处理(tableSizeFor方法)来使得数组长度变成2的次方数。

红黑树的基本概念(JDK1.8之后加入)

在这里插入图片描述

  1. 每个节点是黑色或者是红色;
  2. 根节点是黑色;
  3. 每个叶子节点(NIL)是黑色 (这里叶子节点,是指为空的叶子节点)
  4. 如果一个节点是红色,则它的子节点必须是黑色;
  5. 从一个节点到节点的子孙节点的所有路径上包含相同数目的黑节点。

出现的问题:性价比----时间和空间复杂度

HashMap扩容机制

HashMap中插入东西的时候的思路:
  1. 数组 ---- 没元素,直接放;
  2. key是不是同一个,如果是,替换value;
  3. key不是同一个,且数组有元素,判断是链表或是树 --> 是链表(是否达到树的要求) 没达到就挂链表,达到了就变成树;链表长度达到==8这个数字的时候,会转成红黑树;
  4. key不是同一个,且数组有元素,判断是链表或是树 --> 是红黑树,挂到红黑树后面的节点去;
  5. 当数组被使用的长度达到数组原始长度的四分之三之后,会开始进行扩容机制,数组长度会翻倍。
  6. 这时候,会建立一个新的长度为原长度两倍的数组,然后遍历原数组:
    1. 如果只有一个元素,就直接取模搬过来
    2. 如果数组下是一个链表,就遍历链表之后取模复制过来
    3. 如果是一个树,每个节点再计算一次hash,然后把树打散,一个元素一个元素去拿;
@SuppressWarnings({
   "rawtypes","unchecked"})
            Node<K,V>[] newTab = (Node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值