HashMap

核心原理及常见问题

底层数据结构

JDK7的底层数据结构是数据+链表

JDK8的底层数据结构是数组+链表+红黑树

  • 链表的冲突解决方法:拉链法
  • 引入红黑树的原因:链表查询的时间复杂度事O(n),红黑树查询的时间复杂度事O(logn),当链表长度较长时,查询效率低,引入红黑树可以提高查询效率

扩容机制

  • 默认的初始容量时16,加载因子时0.75,当元素个数>=阈值(容量*加载因子)的时候,就会触发扩容机制
  • 扩容机制:容量扩大为原来的两倍,并且重新计算每个元素的位置,将原数据迁移到新数组
  • put方法的执行流程:
  1. 检查数组是否为空,为空则初始化(扩容);

  2. 计算 key 的哈希值(hash = key.hashCode() ^ (hash >>> 16)),通过 (n-1) & hash 定位数组下标;

  3. 若下标位置无元素,直接新建节点放入;

  4. 若下标位置有元素:

  • 若节点 key 与传入 key 相等(equals 且 hashCode 相等),覆盖 value;

  • 若节点是红黑树节点,调用红黑树插入方法;

  • 若节点是链表节点,遍历链表:

  • 找到相等 key 则覆盖 value;

  • 未找到则尾插法插入新节点,插入后检查链表长度是否 ≥8,若满足则尝试转红黑树;

  1. 插入后检查元素个数是否 ≥ 扩容阈值,若是则触发扩容。
相关推荐
liangbo76 分钟前
06-JVM垃圾回收器之CMS
java·jvm
黑马程序员毕设8 分钟前
基于Java的仪器管理系统设计与实现
java·开发语言·spring boot·后端·微信小程序
骇客野人20 分钟前
SpringBoot电商购物车、结算、下单、库存方案设计与落地实施步骤
java·spring boot·后端
哪 吒40 分钟前
华为OD机试 - 云服务安全策略最优选择 - 深度优先搜索DFS(Java 新系统 200分)
java·华为od·深度优先
拒绝内耗。42 分钟前
程序员学架构(一):一张图看懂 Java 后端架构:一个请求怎样从手机到数据库?
java·智能手机·架构
棣廷43 分钟前
初识Python面向对象
java·开发语言
用户3126874877201 小时前
ThreadLocal 到底会不会内存泄漏?源码级拆解 + 线程池陷阱
java
珍珠先生1 小时前
P11 · MySQL 驱动版本过旧:Client does not support authentication protocol
java
~木雨1 小时前
Java 并发编程架构全景:并发层的五域设计 —— 线程模型、线程池隔离、并发安全到问题治理(全体系汇总)
java·安全·架构·线程池·并发编程·高并发架构
极小狐1 小时前
从复制粘贴到可复用组件:极狐GitLab CI/CD 组件目录实战
java·ci/cd·gitlab·devops·组件化