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

HashMap详解+简单手写实现(哈希表)

1. 什么是 HashMap?

HashMap是Java集合框架中的一种数据结构,它实现了Map接口,用于存储键值对(Key-Value Pair)。HashMap允许null键和null值,并且不保证元素的顺序。

---

2. HashMap 的工作原理

2.1 内部结构
  • 数组 + 链表/红黑树:HashMap内部使用一个数组(称为table)来存储数据,每个数组元素是一个链表或红黑树的头节点。
  • 哈希函数:通过哈希函数将键(Key)映射到数组的索引位置。
2.2 插入数据
  • 计算哈希值:使用键的hashCode()方法计算哈希值。
  • 计算索引:通过哈希值和数组长度计算索引位置。
  • 处理冲突:如果索引位置已经有元素,则通过链表或红黑树处理冲突。
  • 插入数据:将键值对插入到链表或红黑树中。
2.3 查找数据
  • 计算哈希值:使用键的hashCode()方法计算哈希值。
  • 计算索引:通过哈希值和数组长度计算索引位置。
  • 查找数据:在链表或红黑树中查找键值对。
2.4 扩容机制
  • 负载因子:HashMap有一个负载因子(默认0.75),当元素数量超过容量 * 负载因子时,HashMap会进行扩容。
  • 扩容过程:创建一个新的数组,将旧数组中的元素重新哈希到新数组中。

---

3. HashMap 的特点

3.1 优点
  • 快速查找:通过哈希函数,HashMap可以在平均O(1)的时间复杂度内查找元素。
  • 灵活:允许null键和null值。
3.2 缺点
  • 无序:HashMap不保证元素的顺序。
  • 线程不安全:HashMap不是线程安全的,多线程环境下需要使用ConcurrentHashMap。

---

4. 常见问题

4.1 HashMap 和 Hashtable 的区别?
  • HashMap:允许null键和null值,线程不安全。
  • Hashtable:不允许null键和null值,线程安全。
4.2 HashMap 的负载因子为什么是0.75?
  • 负载因子:0.75是时间和空间的一个平衡点,既不会浪费太多空间,也不会导致频繁扩容。
4.3 HashMap 如何处理哈希冲突?
  • 链表:Java 8之前,HashMap使用链表处理冲突。
  • 红黑树:Java 8之后,当链表长度超过8时,HashMap会将链表转换为红黑树,提高查找效率。

---

5. 进一步优化与迭代方向

  • 使用合适的初始容量:根据预估的元素数量设置初始容量,减少扩容次数。
  • 选择合适的负载因子:根据实际需求调整负载因子,平衡时间和空间。
  • 线程安全:在多线程环境下使用ConcurrentHashMap,避免线程安全问题。

6.手写一个哈希表


class HashNode<K,V> {//定义哈希表的节点类K key;V value;HashNode<K,V> next;//用于处理哈希冲突的链表public HashNode(K key, V value){this.key = key;this.value = value;this.next = null;}public static void main(String[] args) {MyHashMap<String, Integer> map = new MyHashMap<>();map.put("Apple", 1);map.put("Banana", 2);map.put("Orange", 3);System.out.println(map.get("Banana")); // 输出: 2map.remove("Banana");System.out.println(map.get("Banana")); // 输出: nullSystem.out.println(map.size()); // 输出: 2}
}
//计算键的哈希值
class MyHashMap<K,V> {private static final int DEFAULT_CAPACITY = 16;//默认容量private static final float LOAD_FACTOR = 0.75f; // 负载因子private HashNode<K, V>[] table;//哈希表数组private int size;//当前元素数量public MyHashMap(){table = new HashNode[DEFAULT_CAPACITY];size = 0;}//计算键的哈希值private int hash(K key){return key == null ? 0 :Math.abs(key.hashCode() % table.length);}//插入键值对public void put(K key,V value){int index = hash(key);HashNode<K,V> node = table[index];//遍历链表,检查是否存在相同的键while (node != null){if(node.key.equals(key)){node.value = value;//更新值return;}node = node.next;}//插入到新节点到链表头部HashNode<K,V> newNode = new HashNode<>(key,value);newNode.next = table[index];table[index] = newNode;size++;//检查是否需要扩容if ((float) size/table.length > LOAD_FACTOR){resize();}}//查找键相对应的值public V get(K key){int index = hash(key);HashNode<K,V> node = table[index];//遍历链表,查找键while (node != null){if (node.key.equals(key)){return node.value;}node = node.next;}return null;//未找到}//删除键值对public void remove(K key){int index = hash(key);HashNode<K,V> node = table[index];HashNode<K,V> prev = null;//遍历链表,查找键while (node != null){if(node.key.equals(key)){if(prev == null){table[index] = node.next;//删除链表头部}else {prev.next = node.next;//删除链表的中间或尾部}size--;return;}prev = node;node = node.next;}}//扩容哈希表private void resize(){int newCapacity = table.length*2;HashNode<K,V>[] newTable = new HashNode[newCapacity];//重新载入哈希所有元素for (HashNode<K,V> node : table){while(node != null){int newIndex = hash(node.key);HashNode<K,V> next = node.next;node.next = newTable[newIndex];newTable[newIndex] = node;node = next;}}table = newTable;}//获取当前元素数量public  int size(){return size;}}

相关文章:

HashMap详解+简单手写实现(哈希表)

1. 什么是 HashMap&#xff1f; HashMap是Java集合框架中的一种数据结构&#xff0c;它实现了Map接口&#xff0c;用于存储键值对&#xff08;Key-Value Pair&#xff09;。HashMap允许null键和null值&#xff0c;并且不保证元素的顺序。 --- 2. HashMap 的工作原理 2.1 内…...

解决Did not find dashscope_api_key问题——jupyter设置环境变量

jupyter中使用通义千文langchain 报错 Value error, Did not find dashscope_api_key, please add an environment variable DASHSCOPE_API_KEY which contains it, or pass dashscope_api_key as a named parameter.我本来以为这样就是已经加上了&#xff1a; #导入相关包 i…...

尚硅谷爬虫note003

一、函数 1. 函数的定义 def 函数名&#xff08;&#xff09;&#xff1a; 代码 2.函数的调用 函数名&#xff08;&#xff09; 3. 定义参数&#xff08;不调用函数不执行&#xff09; def sum&#xff08;a&#xff0c;b&#xff09; #形参 c a b print&#xff08;c&…...

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法&#xff0c;在当今时代&#xff0c;犹如国家关键的战略武器&#xff0c;也是处理各类事务的核心枢纽。算法的世界神秘且变化万千&#xff0c;不够贤能聪慧…...

NO.17十六届蓝桥杯备战|do-while循环|break和continue语句|三道练习(C++)

do-while循环 do-while语法形式 在循环语句中 do while 语句的使⽤最少&#xff0c;它的语法如下&#xff1a; //形式1 do 语句; while( 表达式 );//形式2 do { 语句1; 语句2; ... } while( 表达式 );while 和 for 这两种循环都是先判断&#xff0c;条件如果…...

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网&#xff1a;http://www.icetae.com/【更多详情】 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a…...

Spring Cache 详细讲解

Spring Cache 是 Spring 框架提供的缓存抽象层&#xff0c;通过统一的 API 和注解简化缓存操作&#xff0c;支持多种缓存实现&#xff08;如 Redis、EhCache、Caffeine 等&#xff09;。其核心目标是减少重复计算&#xff0c;提升系统性能&#xff0c;同时保持代码简洁性。 1. …...

CPT205 计算机图形学 OpenGL 3D实践(CW2)

文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业&#xff0c;这次C…...

Netty的基本架构详解

EventLoopGroup基本认识 我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现&#xff0c;下图是他的家族图谱&#xff1a; 我们上一节课使用的案例&#xff0c;使用的是NioEventLoopGroup&#xff0c;他是NIO的实现&#xff0c;可以看出来他是Multithre…...

2025前端面试题超全面解析(附答案与深度扩展)

文章目录 一、HTML篇&#xff08;扩展版&#xff09;1. **HTML5语义化标签的实际应用场景**2. **Web Components实战&#xff1a;如何封装一个自定义按钮组件&#xff1f;**3. **Web Worker的用途与限制** 二、CSS篇&#xff08;扩展版&#xff09;1. **CSS盒模型详解&#xff…...

自己搭建可以和deepseek对话的WEB应用

第一步 下载安装anaconda&#xff0c;地址&#xff1a;https://repo.anaconda.com/ 第二步 打开anaconda客户端&#xff0c;打开conda命令行窗口 第三步 创建一个open-webui专属的python专属的虚拟环境&#xff0c;并且指定python具体的版本 conda create --name open…...

Linux系统运行模式和链接

一、系统运行模式 centos6 0 关机模式 1 单用户模式 2 字符模式&#xff0c;无网络连接 3 字符模式 4 预留 5 图形模式 6 重启模式 查看系统当前处于的运行模式 切换为图形模式 init 5 centos7 字符模式 multi-user…...

.NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项

一、执行过程中&#xff0c;要刷新 进度条 的显示&#xff0c;需要 延时、释放&#xff0c;否则进度条不 实时 更新&#xff0c;最后一下到 100% // 延时&#xff0c;释放给前端&#xff1a;【必须】&#xff0c;否则进度条不 实时 更新&#xff0c;最后一下到 100await Task.D…...

头歌实验--面向对象程序设计

目录 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 第2关&#xff1a;公司支出计算 任务描述 答案代码 第3关&#xff1a;棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关&#xff1a;简易商品系统 任务描述 答案代码 #incl…...

IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up

问题 IoTDB 1.3.2 版本&#xff0c;断电后 IoTDB 的 DataNode 无法启动&#xff0c;日志如下&#xff1a; 2024-12-16 14:45:41,350 [main] ERROR o.a.i.db.service.DataNode:562 - Meet error while starting up. org.apache.iotdb.commons.exception.StartupException: Fo…...

2024华为OD机试真题-最大报酬(C++)-E卷B卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 示例一 解题思路 考点 代码 c++ 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为…...

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins&#xff1b; 2.支持自定义启动参数&#xff1b; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址&#xff1a;https://get.j…...

HCIA项目实践--RIP相关原理知识面试问题总结回答

9.4 RIP 9.4.1 补充概念 什么是邻居&#xff1f; 邻居指的是在网络拓扑结构中与某一节点&#xff08;如路由器&#xff09;直接相连的其他节点。它们之间可以直接进行通信和数据交互&#xff0c;能互相交换路由信息等&#xff0c;以实现网络中的数据转发和路径选择等功能。&am…...

用大模型学大模型04-模型与网络

目前已经学完深度学习的数学基础&#xff0c;开始学习各种 模型和网络阶段&#xff0c;给出一个从简单到入门的&#xff0c;层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制&#xff0c;bert, 大模型&#xff0c;gpt, transformer&#xff0c; MOE等流行…...

浏览器扩展实现网址自动替换

作为一个开发爱好者&#xff0c;不能顺畅访问github是很痛苦的&#xff0c;这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况&#xff0c;我此前知道有一个网站kkgithub&#xff0c;基本上把github的静态内容都搬了过来&#xff0c;我们如果需要访问某个githu…...

适配器模式详解(Java)

一、引言 1.1 定义与类型 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为客户期望的另一个接口。这种模式使得原本因为接口不匹配而不能一起工作的类可以一起工作,从而提高了类的复用性。适配器模式分为类适配器和对象适配器两种类型。类适配器使用继承关…...

C语言表驱动法

最近了解到一种C语言的写法&#xff0c;故记录下来&#xff0c;内容来自deepseek。 表驱动法 表驱动法&#xff08;Table-Driven Approach&#xff09;是一种编程技术&#xff0c;通过使用表格&#xff08;数组、结构体数组、哈希表等&#xff09;来存储数据或逻辑&#xff0…...

【鸿蒙Next】优秀鸿蒙博客集锦

鸿蒙基础开发&#xff1a;多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客...

Django REST Framework:如何获取序列化后的ID

Django REST Framework&#xff1a;如何获取序列化后的ID &#x1f604; 嗨&#xff0c;小伙伴们&#xff01;今天我们来聊一聊Django REST Framework&#xff08;简称DRF&#xff09;中一个非常常见的操作&#xff1a;如何获取序列化后的ID。对于那些刚入门的朋友们&#xff…...

deep seek

1.介绍:DeepSeek是一款由国内人工智能公司研发的大型语言模型&#xff0c;拥有强大的自然语言处理能力&#xff0c;能够理解并回答问题&#xff0c;还能辅助写代码、整理资料和解决复杂的数学问题。免费开源&#xff0c;媲美ChatGPT 最近最火爆的AI对话程序。 www.deepseek.com…...

前端设计模式介绍及案例(单例模式、代理模式、工厂模式、装饰者模式、观察者模式)

概要 本文主要介绍了前端设计模式的定义、分类以及常用设计模式的具体案例。 前言 使用设计模式的目的&#xff1a;为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化&#xff1b;设计模式是软件工程的基石脉络&#xff0c;如同大厦…...

开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1

文章目录 开源堡垒机 JumpServer 社区版实战教程&#xff1a;基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1一、环境要求1.1 操作系统1.1.1 Ubuntu1.1.2 CentOS 1.2 数据库1.2.1 JumpServer 需要使用的数据库1.2.2 创建数据库 SQL 参考1.2.2.1 PostgreSQL1.2.2.2 MySQL…...

电源测试和测量系统的创新遥感方法可以消除哪些潜在问题

传统的遥感方法 远程感测是一种行之有效的方法&#xff0c;通过消除连接电缆中压降的影响来调节负载点的直流功率。这在测试和测量应用中尤其重要&#xff0c;在这些应用中&#xff0c;电源电压在一系列负载条件下的准确性和一致性通常对于获得准确且可重复的测试结果至关重要…...

10、《Thymeleaf模板引擎:动态页面开发全攻略》

Thymeleaf模板引擎&#xff1a;动态页面开发全攻略 一、Thymeleaf核心价值解析 天然HTML亲和力&#xff1a;Thymeleaf允许直接使用.html文件作为模板&#xff0c;支持浏览器直接预览静态原型&#xff0c;同时通过属性标签&#xff08;如th:text&#xff09;实现动态渲染&…...

Day1 25/2/14 FRI

【一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;】https://www.bilibili.com/video/BV13g41157hK?p3&v…...

untiy3D 让角色动起来,角色动画的使用

1.untiy 商店下载动画模型 2.导入项目 模型拖入到场景中 3.创建动画器控制器 4.动画控制器挂载到plarer上 5.把动画idle和pickup拖入到动画器 6.右键动画创建过渡效果(Make Transition) 6.设置参数用条件控制 7.当选中参数时启动过渡 运行效果 119 (二)用脚本控制动画…...

Word 里面嵌入DeepSeek

目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档&#xff0c;按 AltF11&#xff0c;进入VB界面。 2、选中文档&#xff0c;右键->插入->模块。 3、进入模块&#xff0c;粘入…...

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…...

exr 格式下 全景图(经纬图、panorama)转 cubemap

先上效果 &#xff08;X, -X, Y, -Y, Z, -Z&#xff09; 下载 exr 经纬图 笔者用的这张&#xff1a;https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky 使用 Openexr 的 exrenvmap 工具 下载 我 build 了一份 3.3.2 版本的&#xff0c;免积分下载。 https:/…...

解锁建造者模式:Java 编程中的对象构建秘籍

系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品(Product)2.2.2 建造者(Builder)2.2.3 具体建造者(ConcreteBuilder)2.2.4 指挥者(Director)2.3 工作流程与交互机制三、建造者模式在 Java 中的优势3.1 …...

ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全

ArcGIS Pro对于显示缓存有32GB的限制&#xff0c;所以当缓存设置中&#xff0c;缓存将达到32GB时&#xff0c;会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置&#xff0c;然后单击选项&#xff1b; 2.在选项窗口中&…...

大数据、云计算、人工智能等技术深度融合的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法&#xff0c;用于对范围内的元素进行归并操作。它…...

Python爬虫实战:获取笔趣阁图书信息,并做数据分析

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备与反爬策略 python import requests from bs4 import BeautifulSoup import pandas as pd import re import time import random from fake_useragent …...

win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录

DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法&#xff0c;以及后续使用夜神模拟器&#xff0c;关闭了Hyper-V时&am…...

c# sqlite 批量生成insert语句的函数

函数开始 using System; using System.Collections.Generic; using System.Text;public class SqliteHelper {public static List<string> GenerateInsertStatements(string tableName, List<string> columns, List<List<object>> data){List<stri…...

ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类

使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 3.1.x&#xff09;添…...

湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构

导读&#xff1a;浙江霖梓早期使用 CDH 产品套件搭建了大数据系统&#xff0c;面临业务逻辑冗余、查询效率低下等问题&#xff0c;基于 Apache Doris 进行整体架构与表结构的重构&#xff0c;并基于湖仓一体和查询加速展开深度探索与实践&#xff0c;打造了 Doris Paimon 的实…...

【AI-34】机器学习常用七大算法

以下是对这七大常用算法的浅显易懂解释&#xff1a; 1. k 邻近算法&#xff08;k - Nearest Neighbors&#xff0c;KNN&#xff09; 想象你在一个满是水果的大广场上&#xff0c;现在有个不认识的水果&#xff0c;想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...

2025年金三银四经典自动化测试面试题

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…...

遵循规则:利用大语言模型进行视频异常检测的推理

文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly &#xff08;正常与异常&#xff09;Abstract and Concrete &#xff08;抽象与具体&#xff09;Human and Environment &#xff08;人类与环境&#xff09; 3…...

RFM模型-数据清洗

在进行数据清洗时&#xff0c;主要的目标是确保数据质量良好&#xff0c;以便后续的分析和建模工作能够顺利进行。针对你使用粒子群优化算法改进RFM模型来对电商数据进行用户群像划分的实验&#xff0c;数据清洗环节尤其重要&#xff0c;因为不干净的数据会影响模型的精度和效果…...

文件系统惹(细)

目录 块概念 分区 inode ext2文件系统 Boot Sector Super Block GDP&#xff08;group descriptor table&#xff09; Block Bitmap&#xff08;块位图&#xff09; Inode Bitmap &#xff08;inode位图&#xff09; Data Block inode和Datablock映射 目录和文件名 …...

中望CAD c#二次开发 ——VS环境配置

新建类库项目&#xff1a;下一步 下一步 下一步&#xff1a; 或直接&#xff1a; 改为&#xff1a; <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...

Centos7安装Clickhouse单节点部署

​ 部署流程 1、关闭防火墙&沙盒 关闭防火墙并关闭开机自启动 systemctl stop firewalld && systemctl disable firewalld查看selinux状态是否为disabled&#xff0c;否则修改 [rootlocalhost ~]# getenforce Enforcing修改为disabled vim /etc/selinux/config…...