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. 插入后检查元素个数是否 ≥ 扩容阈值,若是则触发扩容。
相关推荐
oddsand19 小时前
Redis网络模型
java·数据库·redis
皮卡祺q9 小时前
【redies0-导论】分布式系统的演进-引进redis原因
java·数据库·redis
roman_日积跬步-终至千里9 小时前
如何分析复杂架构:一套真正能落地的方法
java·开发语言·架构
武子康9 小时前
Java-02 深入浅出MyBatis 3 快速入门:环境配置、项目创建与 CRUD 操作
java·后端
Don.TIk9 小时前
ChapterOne-搭建项目骨架
java·spring·spring cloud·mybatis
Don.TIk9 小时前
ChaperTwo-整合 SaToken 实现 JWT 登录功能
java·开发语言
qq_2518364579 小时前
基于java Web汽车销售管理系统设计与实现
java·前端·汽车
南极企鹅9 小时前
事务&@Transactional注解
java·数据库·spring·oracle·mybatis
yaoxin5211239 小时前
406. Java 文件操作基础 - 字符与二进制流
java·开发语言·python
happymaker06269 小时前
SpringBoot学习日记——DAY02(SpringBoot整合Swagger3)
java·spring boot·学习