Hashmap的工作原理

HashMap是一种常见的键值对存储数据的数据结构,它的工作原理可以简单概括为以下几个步骤:

  1. 哈希函数:当我们向HashMap中存入一个键值对时,首先会通过哈希函数将键映射到一个索引位置上。这个哈希函数将键转化为一个整数,这个整数就是该键值对在数组中的索引位置。

  2. 数组存储:HashMap内部使用一个数组来存储键值对。在对应索引位置上,将键值对存储在数组中。

  3. 冲突处理:由于哈希函数的结果可能会出现冲突,即多个键值对映射到了同一个索引位置上。为了解决冲突问题,HashMap使用了链表或红黑树的数据结构来存储多个键值对。

  • 链表:当冲突发生时,新的键值对会被添加到链表的末尾。这样,从数组中的索引位置开始,通过遍历链表,即可找到对应的键值对。
  • 红黑树:为了提高查找效率,当链表长度超过一定阈值(默认为8)时,链表会转化为红黑树存储方式。
  1. 查找和删除:当我们需要查找一个键值对时,首先使用哈希函数获得索引位置,然后遍历链表或红黑树,找到对应的键值对。当我们需要删除一个键值对时,也是通过查找找到对应的键值对,然后将其从链表或红黑树中删除。

总结起来,HashMap的工作原理是通过哈希函数将键映射到数组的索引位置上,解决冲突问题,并使用链表或红黑树来存储多个键值对。这样可以以常数时间复杂度O(1)进行插入、查找和删除操作,使HashMap成为一种高效的数据结构。

以下是一个简单的 HashMap 源码示例:

import java.util.LinkedList;class Entry {private Object key;private Object value;public Entry(Object key, Object value) {this.key = key;this.value = value;}public Object getKey() {return key;}public Object getValue() {return value;}
}public class HashMap {private int capacity;private LinkedList<Entry>[] buckets;public HashMap(int capacity) {this.capacity = capacity;this.buckets = new LinkedList[capacity];}public void put(Object key, Object value) {int index = getIndex(key);LinkedList<Entry> bucket = buckets[index];if (bucket == null) {bucket = new LinkedList<>();buckets[index] = bucket;}for (Entry entry : bucket) {if (entry.getKey().equals(key)) {entry.setValue(value);return;}}bucket.add(new Entry(key, value));}public Object get(Object key) {int index = getIndex(key);LinkedList<Entry> bucket = buckets[index];if (bucket != null) {for (Entry entry : bucket) {if (entry.getKey().equals(key)) {return entry.getValue();}}}return null;}public void remove(Object key) {int index = getIndex(key);LinkedList<Entry> bucket = buckets[index];if (bucket != null) {for (Entry entry : bucket) {if (entry.getKey().equals(key)) {bucket.remove(entry);return;}}}}private int getIndex(Object key) {int hashCode = key.hashCode();return hashCode % capacity;}
}

这是一个简化的 HashMap 的实现,使用数组和链表来存储键值对。它具有以下功能:

  • put(key, value):将给定的键值对添加到 HashMap 中。
  • get(key):根据给定的键返回相应的值。
  • remove(key):根据给定的键删除相应的键值对。

该实现使用哈希函数将键映射到数组索引。如果发生哈希冲突,即不同的键映射到相同的索引,它使用链表来解决冲突。每个数组索引都是一个链表,其中包含具有相同哈希码的键值对。

请注意,此实现仅用于演示目的。在实际应用中,Java 提供了更强大和高效的 HashMap 实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运放知识点总结

目录 一、运放基础知识 (operational amplifier) 1.由来 2.用途 3.符号 4.内部结构​编辑 5.虚短虚断 二、同相放大电路 &#xff08;Non-inverting Amplifier&#xff09; 三、反相放大电路 (Inverting Amplifier) 四、差分放大电路 (Difference Amplifier) 五、加法…

【Rust】——Trait

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

移动端-2(媒体查询+Less基础+rem适配方案+响应式布局+Bookstrap前端开发构架)

目录 1.rem布局 2.媒体查询 什么是媒体查询 语法规范 mediatype查询类型 关键字 媒体特性 3.Less基础 维护css的弊端 less介绍 less变量 less嵌套 less运算 4.rem适配方案 rem实际开发适配方案1 设计稿常见尺寸宽度 动态设置html标签font-size大小 元素大小取…

网络协议——STP(生成树协议)

1. 什么是环路&#xff1f; 信息经过一系列的转化或传递&#xff0c;然后再返回到起始点&#xff0c;形成一个闭合的循环。 2. 环路的危害 广播风暴&#xff08;广播报文充斥着整个网络&#xff09; MAC地址漂移&#xff0c;从而导致MAC地址表震荡。 使用 display mac…

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型&#xff0c;包括整型&#xff08;如i32、u32&#xff09;、浮点型&#xff08;如f32、f64&#xff09;、布尔类型&#xff08;bool&#xff09;和字符类型&#xff08;char&#xff09;。此外&#xff0c;Rust还提供了原生数组、元组…

医学图像处理 利用pytorch实现的可用于反传的Radon变换和逆变换

医学图像处理 利用pytorch实现的可用于反传的Radon变换和逆变换 前言代码实现思路实验结果 前言 Computed Tomography&#xff08;CT&#xff0c;计算机断层成像&#xff09;技术作为如今医学中重要的辅助诊断手段&#xff0c;也是医学图像研究的重要主题。如今&#xff0c;随…

Mac安装配置Appium

一、安装 nodejs 与 npm 安装方式与 windows 类似 &#xff0c;官网下载对应的 mac 版本的安装包&#xff0c;双击即可安装&#xff0c;无须配置环境变量。官方下载地址&#xff1a;https://nodejs.org/en/download/ 二、安装 appium Appium 分为两个版本&#xff0c;一个是…

yolov9训练自己的数据—vehicle 4类

yolov9训练自己的数据 1 conda环境安装指定版本torch 2 预训练模型测试3 训练自己的数据集3.1 制作数据3.2 创建模型配置文件3.3 创建数据加载配置文件3.4 使用ClearML跟踪训练日志3.5 训练3.6 模型测试3.7 转换成TensorRT模型 4 参考文档 1 conda环境 下载yolov9代码&#xf…

C语言:顺序表专题

目录 一、数据结构之顺序表/链表1.数据结构相关概念1.1什么是数据结构1.2为什么需要数据结构 二、顺序表1.顺序表的概念及结构2.顺序表分类3.动态顺序表的实现 一、数据结构之顺序表/链表 1.数据结构相关概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来…

解锁ETLCloud中Kettle的用法

随着大数据时代的到来&#xff0c;数据的处理和管理成为各行各业不可或缺的一环。ETL&#xff08;Extract-Transform-Load&#xff09;工具作为数据处理的重要环节&#xff0c;扮演着将数据从源端抽取出来、经过转换处理&#xff0c;最终加载至目标端的关键角色。在众多ETL工具…

【Python】数据挖掘与机器学习(一)

【Python】数据挖掘与机器学习(一) 大家好 我是寸铁&#x1f44a; 总结了一篇【Python】数据挖掘与机器学习(一)sparkles: 喜欢的小伙伴可以点点关注 &#x1f49d; 【实验1】预测鲍鱼年龄 问题描述 请从一份数据中预测鲍鱼的年龄&#xff0c;数据集在abalone.cvs中&#xff…

【Qt】:常用控件(二:QWidget核心属性)

常用控件&#xff08;二&#xff09; 一.cursor&#xff08;光标形状&#xff09;二.font&#xff08;字体信息&#xff09;三.toolTip&#xff08;提示显示&#xff09;四.focusPolicy&#xff08;焦点&#xff09;五.styleSheet&#xff08;文本样式&#xff09; 一.cursor&a…

Java BigDecimal类

原因 为什么要有BigDecimal类因为二进制的缘故&#xff0c;直接对浮点数进行运算&#xff0c;会导致精度丢失的问题下例&#xff1a;出现了0.1 0.2 <> 0.3 常见的API 这些API中&#xff0c;并不推荐由double类型转换的BigDecimal,因为底层还是double推荐使用由string 类…

QT5-qmediaplayer播放视频及进度条控制实例

qmediaplayer是QT5的播放视频的一个模块。它在很多时候还是要基于第三方的解码器。这里以Ubuntu系统为例&#xff0c;记录其用法及进度条qslider的控制。 首先&#xff0c;制作一个简单的界面文件mainwindow.ui&#xff1a; 然后&#xff0c;下载一个mp4或其他格式视频&#x…

【算法集训】基础算法:二分查找 | 概念篇

二分枚举&#xff0c;也叫二分查找&#xff0c;指的就是给定一个区间&#xff0c;每次选择区间的中点&#xff0c;并且判断区间中点是否满足某个条件&#xff0c;从而选择左区间继续求解还是右区间继续求解&#xff0c;直到区间长度不能再切分为止。 由于每次都是把区间折半&am…

小程序实现订阅功能和测试发送订阅信息

现在一次性订阅是只能用户点一次才能发送一次&#xff0c;而针对长期模板只有规定的几种类目政务、民生、交通等等的才可以&#xff0c;所以说感觉这功能其实已经不是很适合使用了&#xff0c;只适合一些特别的场景才可以使用。 地址&#xff1a;https://developers.weixin.qq…

where 函数

Pandas 中的 where 函数 在 Pandas 中&#xff0c;where 函数用于替换不满足条件的值。具体来说&#xff0c;它返回一个与原始 DataFrame 或 Series 形状相同的新对象&#xff0c;但所有不满足条件的值都被替换为指定的值&#xff08;默认为 NaN&#xff09;。 对于 DataFram…

【Web应用技术基础】JavaScript(7)——案例:点击文字则放大字体

视频已发。截图如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Java基础知识总结(43)

&#xff08;1&#xff09;初始化块 和构造方法具有相同功能的是初始化块。当创建Java对象时&#xff0c;系统总是先调用类中定义的初始化块 &#xff08;2&#xff09;静态初始化块 如果定义初始化块使用了static修饰&#xff0c;则这个初始化块就变成了静态初始化块&#xf…

html基础介绍

概念 HTML 文件 扩展名是 .html 的文件称为网页文件或者HTML文件HTML 文件使用代码编辑进行编辑&#xff0c;使用浏览器查看效果 声明方式 <!Doctype html>&#xff01;DOCTYPE 是一个文档类型标记&#xff0c;是一种标准通用标记语言的文档类型声明&#xff0c;在 w…