java-HashMap

本文深入探讨了HashMap的内部机制,包括其基于哈希表的数据结构、put和get操作的实现过程,以及key的特点。还提到了初始化容量和加载因子对性能的影响。当使用不当,如所有元素映射到同一链表或链表长度为1时,HashMap性能将无法充分发挥。了解这些原理有助于优化HashMap的使用。
摘要由CSDN通过智能技术生成

HashMap

1.原理解释

  • HashMap集合底层是哈希表/散列表的数据结构
  • 哈希表
    • 哈希表是一个数组和单项链接表的结合体
    • 数组:在查询方面效率很高,随机增删方面效率很低
    • 单向链表:在随机增删方面效率很高,在查询方面效率很低
    • 哈希表将以上两种数据结构融合在一起,充分发挥他们各自的优点
  • HashMap底层实现
    在这里插入图片描述
  • HashMap两个重点方法
    • put(k,v)
      • 将k,v封装到Node对象当中
      • 底层调用hashCode()方法的得到hash值,通过哈希函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上,如果说下标对应的位置上有链表,此时会拿着k和链表上每一个节点的k进行equals,如果所有的equals方法返回的false,那么这个新节点将会被添加到链表的末尾,如果其中有一个equals返回了true,那么这个新节点将被添加到链表的末尾,如果其中一个equals返回了true,那么这个节点的value将会被覆盖。
    • get(k)
      • 调用hashCode()方法得出hash值,通过哈希算法转换成数组下标,通过数组下标快速定位到某个位置上,如果这个位置上什么也没有,返回null,如果这个位置上有单项链表,那么会拿着参数k和单项链表上的每个节点中的k进行equals,如果所有的equals方法返回false,那么get方法返回null,只要其中有一个节点的k和参数k的equals的时候返回true,那么此时这个节点的value就是我,们要找的value,get方法最终返回这个要找得value。
  • HashMap集合的key的部分特点
    • 无序且不可重复
    • 无序->因为不一定挂到哪一个单项链表上
    • 不可重复->equals方法来保障HashMap集合的key不可重复,如果key重复了value会覆盖
  • 哈希表HashMap使用不当时无法发挥性能
    • 1.全部放在一个单向链表
    • 2.每个单向链表长度都是1
      在这里插入图片描述
  • HashMap集合的默认初始化容量是16,默认加载因子是0.75
    • 默认加载因子:HashMap集合底层数字的容量达到75%时,数组开始扩容
    • HashMap集合初始化容量必须是2个倍数,这也是官方推荐的,这是因为达到散列均匀,为了提高HashMap集合的存取效率所必须的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值