当前位置: 首页 > news >正文

HashMap 底层原理 面试官问 如何回答

HashMap 底层原理在 JDK 1.7 中HashMap 中保存的是 Entry 对象key 和 value 都是 Entry 对象的属性。HashMap 在 JDK 1.7 中底层数据结构是数组链表JDK 1.8 中是数组链表红黑树。HashMap 在使用 put 方法添加元素时会根据要添加元素的 key 的 hashCode 方法计算 hash 值然后根据 hash 值计算出元素在数组中的存储位置。当数组当前位置已经存在元素时如果两个元素 key 计算出的 hash 值不相同则说明是两个不同的元素把数组当前位置上原有的元素取出然后把新的元素添加到数组当前位置上新的元素的 next 属性指向原来的元素形成链表结构HashMap 中的元素都是 Entry 对象Entry 对象有 next 属性用于记录下一个元素的位置。当数组当前位置已经存在元素时如果两个元素 key 计算出的 hash 值相同equals 方法比较返回 true说明是两个相同的元素则把旧元素从数组位置上取出新的元素放到数组位置上put 会返回被替换元素的 value 值。如果数组当前位置没有元素则直接添加元素到数组当前位置put 方法返回 null。HashMap 默认的数组大小是 16计算因子是 0.75,16 * 0.75 12当数组的长度达到临界值 12 时会触发数组的扩容机制。JDK 1.7 和 JDK 1.8 HashMap 的不同之处JDK 1.7 中创建 HashMap 对象时就初始化了数组的长度。JDK 1.8 中创建 HashMap 对象时数组长度是 0首次添加元素初始化数组长度。JDK 1.7 中 HashMap 中保存的是 Entry 对象key 和 value 都是 Entry 对象的属性。JDK 1.8 中 HashMap 中保存的是 Node 对象key 和 value 都是 Node 对象的属性。JDK 1.7 中添加元素时当数组位置上已经存在元素时使用头插法添加元素即新添加的元素指向原来的元素。JDK 1.8 中使用尾插法添加元素即原来的元素指向新添加的元素。JDK 1.7 中底层数据结构是数组链表JDK 1.8 中是数组链表红黑树。当数组某个索引位置上的元素个数达到 8 时并且数组长度达到 64 时这个索引位置的元素由链表转为红黑树可以提高查询修改删除操作的效率。当使用红黑树的索引位置上的元素数量低于 6 时退化为链表结构因为红黑色占用的空间大。面试时直接回答 JDK 1.8 的 HashMap 原理即可JDK 1.8 中 HashMap 中保存的是 Node 对象key 和 value 都是 Node 对象的属性。JDK 1.8 中底层数据结构是数组链表红黑树。当数组某个索引位置上的元素个数达到 8 时并且数组长度达到 64 时这个索引位置的元素由链表转为红黑树可以提高查询修改删除操作的效率。当使用红黑树的索引位置上的元素数量低于 6 时退化为链表结构因为红黑色占用的空间大。HashMap 在使用 put 方法添加元素时会根据要添加元素的 key 的 hashCode 方法计算 hash 值然后根据 hash 值计算出元素在数组中的存储位置。当数组当前位置已经存在元素时如果两个元素 key 计算出的 hash 值不相同则说明是两个不同的元素旧的元素的 next 属性会指向新的元素形成链表结构HashMap 中的元素都是 Node 对象Node 对象有 next 属性用于记录下一个元素的位置。当数组当前位置已经存在元素时如果两个元素 key 计算出的 hash 值相同equals 方法比较返回 true说明是两个相同的元素则把旧元素从数组位置上取出新的元素放到数组位置上put 会返回被替换元素的 value 值。如果数组当前位置没有元素则直接添加元素到数组当前位置put 方法返回 null。HashMap 默认的数组大小是 16计算因子是 0.75,16 * 0.75 12当数组的长度达到临界值 12 时会触发数组的扩容机制。
http://www.gsyq.cn/news/1360697.html

相关文章:

  • 从Hub到Router:家庭网络升级踩坑实录,手把手教你选对设备
  • 从“软启动”到防误触:三极管驱动MOS管的4个经典电路场景拆解(含避坑指南)
  • 2026年南京军事夏令营大揭秘,哪家才是你的最佳之选? - GrowthUME
  • MATLAB机器人工具箱终极实战指南:从建模到控制完整解决方案
  • UHF-RFID运动检测技术原理与优化实践
  • Boss-Key:职场隐私保护终极指南,一键隐藏窗口的智能解决方案
  • 保姆级教程:手把手复现XCTF攻防世界MOBILE入门9题(附Python/Java解密脚本及避坑指南)
  • 【混合可再生能源模拟】使用遗传算法优化光伏板和电池的容量附matlab代码
  • 【模型辨识】基于最小二乘法 LS 递推最小二乘法 RLS实现Hammerstein 模型辨识非线性静态环节 + 线性ARX动态环节附Matlab代码
  • 终极配置指南:如何在macOS上快速完成res-downloader HTTPS嗅探工具完整设置
  • 【MATLAB源码-第445期】基于MATLAB的高速V2X车联网OFDM系统多普勒频偏估计补偿与误码率性能仿真
  • 泉州AI培训:泉州元数科技助力晋江市退役军人AI职业技能提升 - 新闻快传
  • 别再为虚拟机卡顿烦恼!实测VMware 16 + Ubuntu 20.04下Gazebo 11流畅运行无人船仿真的完整配置清单
  • 验证旋转中心流程
  • 飞书秒变 Claude Code 控制台:一个 Bridge 项目,正在改写 AI 编程入口
  • 九点标定验证流程
  • 从原理到实战:为什么安全工程师和红队偏爱TCP Traceroute?手把手教你用它进行网络侦察
  • MacBook到手后,除了装Homebrew,这5个zsh插件能让你的终端效率翻倍
  • 为开源AI项目配置HermesAgent使用Taotoken作为模型供应商指南
  • ShiroAttack2实战指南:从漏洞检测到内存马注入的完整揭秘
  • Taotoken多模型聚合平台助力Matlab开发者构建智能分析工具
  • 在Taotoken模型广场根据任务需求挑选合适模型的实践
  • 深圳高空广告工程:物料制作要点梳理与专业安装流程详解 - GrowthUME
  • 不止股票!Alpha Vantage API隐藏玩法:用Python抓取加密货币、经济指标和新闻情绪数据
  • 莫比乌斯反演学习笔记
  • 实战分享:用Kprobe和Jprobe在Ubuntu 22.04上安全地Hook内核函数(附完整代码)
  • 别再死记硬背了!从AMBA总线到实际芯片,深入理解Verilog仲裁器的设计哲学
  • 从加密狗激活到平台注册:dSPACE MicroAutoBOX II 与 MATLAB 2016b 联调实战记录
  • Win11高分辨率下C# WinForm字体发虚?别慌,这份DPI感知配置清单请收好
  • 2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成保姆级流程