20250120面试鸭特训营第28天

news/2025/1/21 10:17:47/

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

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.ppmy.cn/news/1564918.html

相关文章

Ghost硬盘对拷教程分享

Ghost32是一款老古董级别的备份和恢复软件&#xff0c;通常用于创建系统镜像以及恢复系统。它最初由Symantec公司开发&#xff0c;用于在计算机系统上进行备份、克隆和恢复操作。 由于这个软件早已停止更新很多年了&#xff0c;并且也是全英文的用户界面&#xff0c;对国内用户…

山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移测评

这篇文档将深入解析标题和描述中提及的IT知识点&#xff0c;主要关注地理信息系统&#xff08;GIS&#xff09;和ArcGIS软件的应用&#xff0c;以及shp文件格式的相关知识。 我们要理解"山西省乡镇界面图层shp格式arcgis数据乡镇名称和编码2020年wgs84坐标无偏移.zip&quo…

[HDCTF2019]Maze

[HDCTF2019]Maze 一、查壳 有壳upx&#xff0c;32位&#xff0c;解壳 二、IDA分析 刚一点进去就发现花指令&#xff0c;不出意外无法F5. 花指令&#xff0c;其特征就是在jnz后面call里面出现非法指令。&#xff08;会爆红&#xff09; 所以我们现在要解决花指令 三、解决…

c# PDF文件合并工具

界面 主要用于发票PDF文件的合并。经常出差要报销的很有用。 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System…

Python毕业设计选题:基于django+vue的智能租房系统的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 租客注册 添加租客界面 租客管理 房屋类型管理 房屋信息管理 系统管理 摘要 本文首…

springboot基于安卓的智启教育服务平台app

基于Spring Boot的智启教育服务平台App是一个结合了Spring Boot后端框架与安卓前端技术的综合性教育服务平台。 一、技术背景与架构 1.开发语言&#xff1a;后端采用Java语言开发&#xff0c;充分利用Java的跨平台性、面向对象特性和强大的后端处理能力。前端则使用安卓开发技…

线程同步与Mutex

梦想是逃离世界… 文章目录 一、什么是线程同步&#xff1f;二、线程同步机制三、互斥锁&#xff08;Mutex&#xff09;四、loock 和 unlock五、Mutex的四种类型 一、什么是线程同步&#xff1f; 线程同步(Thread Synchronization)是多线程编程中的一个重要概念&#xff0c;它…

基于微信小程序的安心陪诊管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…