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. 插入后检查元素个数是否 ≥ 扩容阈值,若是则触发扩容。
相关推荐
BestAns5 小时前
一文带你吃透 Java 反射机制
java·后端
wasp5205 小时前
AgentScope Java 核心架构深度解析
java·开发语言·人工智能·架构·agentscope
2501_916766546 小时前
【Springboot】数据层开发-数据源自动管理
java·spring boot·后端
自在极意功。6 小时前
MyBatis 动态 SQL 详解:从基础到进阶实战
java·数据库·mybatis·动态sql
软件管理系统6 小时前
基于Spring Boot的便民维修管理系统
java·spring boot·后端
百***78757 小时前
Step-Audio-2 轻量化接入全流程详解
android·java·gpt·php·llama
快乐肚皮7 小时前
MySQL递归CTE
java·数据库·mysql·递归表达式
廋到被风吹走7 小时前
【Spring】DispatcherServlet解析
java·后端·spring
廋到被风吹走7 小时前
【Spring】PlatformTransactionManager详解
java·spring·wpf