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

20250120面试鸭特训营第28天

更多特训营笔记详见个人主页【面试鸭特训营】专栏

250120

1. 说说 Java 中 HashMap 的原理?

HashMap 的底层结构

  • HashMap 底层由 node 数组、单链表、红黑树构成。
  • 根据哈希函数计算得到哈希值,哈希值确定了元素保存在 node 数组中的具体下标。
  • HashMap 的默认初始容量为 16,负载因子为 0.75。当存储的元素超过 16 × 0.75 = 12 个时,HashMap 会触发扩容操作,将容量 ×2 并重新分配元素位置。
  • 扩容是比较耗时的操作,频繁扩容会影响性能。

哈希冲突

  • 两个不同的元素,经过哈希函数计算之后,可能会得到相同的哈希值,映射到 node 数组的同一个下标,产生哈希冲突。
  • 哈希冲突有多种解决方案,如链地址法,开放寻址法(线性探测、平方探测),再哈希法, HashMap 中采用的是链地址法。
  • 在每个数组下标下挂一个单链表,单链表内保存的是【具有相同哈希值的不同元素】。
  • 当单链表中保存的元素 >= 8 时,为提升查找效率,单链表转为红黑树。
    • 最坏情况下,单链表的查找时间复杂度是O(N),红黑树的查找时间复杂度是O(logN)。
  • 当红黑树中保存的元素 <= 6 时,为提升增删效率,红黑树转为单链表。
    • 红黑树在增删节点时,需要通过自旋和染色维持红黑树的平衡。

2. Java 中有哪些集合类?请简单介绍

在这里插入图片描述

3. Java 中 HashMap 的扩容机制是怎样的?

  • 负载因子

    • 一个介于 0 到 1 的小数,当存储占比达到负载因子时,会通过扩容机制进行扩容。
  • HashMap 的负载因子是 0.75 ,当 HashMap 已存储元素数量超过当前容量的 75% 时,就会进行扩容。

  • 以初始容量 16 为例

    • 扩容阈值:16 × 0.75 = 12。
    • 前 12 个元素正常存储,当存入第 13 个元素时,HashMap 会进行扩容。
    • 每次扩容时
        1. 会将 HashMap 的容量扩大为当前容量的 2 倍。
        1. HashMap 需要重新计算所有元素的哈希值,并将它们重新分配到新的哈希桶中,这个过程称为rehashing。每个元素的存储位置会根据新容量的大小重新计算哈希值,并移动到新的数组中。
    • 由于每次扩容都需要重新遍历当前所有元素,重新计算元素的哈希值并移动到新的位置,所以扩容是一个很耗时的操作,频繁扩容会导致性能明显下降。
    • 优化方案:如果能预估到 HashMap 中大概会存储多少数据,可以在创建 HashMap 的时候就指定一个较大的初始容量,以减少扩容次数。
      • 例:对于存储 100 万个元素的 HashMap ,可以直接设置一个 1024 × 1024 的初始容量,避免多次扩容。

http://www.kler.cn/a/512948.html

相关文章:

  • 用于牙科的多任务视频增强
  • Visual Studio Community 2022(VS2022)安装方法
  • apisix的authz-casbin
  • 基于python+Django+mysql鲜花水果销售商城网站系统设计与实现
  • 在离线无管理员权限的情况下为Linux配置oh-my-zsh(zsh+oh my zsh+powerlevel10k)
  • 【QT】已解决:Qt4.11.0无法使用MSVC编译器问题
  • 计算机网络 (48)P2P应用
  • feign调用跳过HTTPS的SSL证书校验配置详解
  • Android 右键后无Java class创建
  • 2024:在成长、创作与生活中找到星光
  • SSM宠物医院信息管理系统
  • C# 的 NLog 库高级进阶
  • PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统
  • TaskBuilder前后端通讯的数据格式
  • 扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践
  • 持续集成工具Jenkins(一)
  • 服务器机房迁移,centos系统root无法登录,也无法联网等问题
  • Pandas 数据分析(二)【股票数据】
  • Windows7搭建Hadoop-2.7.3源码阅读环境问题解决列表
  • Maven私服-Nexus3安装与使用
  • Android SystemUI——自定义状态栏和导航栏(十二)
  • 特朗普:加密货币列为国家优先事项
  • Visual Studio 2022中文软件下载安装过程
  • DNS DDoS攻击是怎么回事?怎么预防?
  • 【网络原理】万字详解 HTTP 协议
  • 【Python运维】用Python管理Docker容器:从`docker-py`到自动化部署的全面指南