哈希Hash

news/2024/7/7 19:30:47

HashMap是Java中常用的数据结构之一,它提供了高效的键值对存储和检索功能。下面是HashMap底层的详细原理介绍:

1. 数据结构:HashMap底层使用数组和链表(或红黑树)的组合实现。它通过哈希算法将键转换为数组索引,并将值存储在对应索引位置上。

2. 哈希算法:当我们向HashMap中存储一个键值对时,HashMap会调用键的hashCode()方法来计算哈希码(hash code)。哈希码是一个整数,用于确定键值对在数组中的存储位置。

3. 数组存储:HashMap内部维护了一个Entry数组,用于存储键值对。数组的每个位置称为桶(bucket),每个桶可以存储一个或多个键值对。数组的初始大小为16,可以根据需要进行动态扩容。

4. 解决哈希冲突:由于不同的键可能生成相同的哈希码,可能会导致哈希冲突。当发生哈希冲突时,HashMap使用链表或红黑树来解决。在JDK 8之前,采用链表方式解决冲突;而在JDK 8及以后的版本,当链表长度超过一定阈值(默认为8)时,链表会自动转化为红黑树,以提高查找效率。

5. 键值对存储:HashMap的每个键值对被封装在一个Entry对象中,包含键、值和指向下一个Entry的指针(在链表中)。当存储一个键值对时,HashMap会根据哈希码找到对应的桶,然后在桶中查找键是否已存在。如果存在相同的键,则更新对应的值;否则,将新的键值对添加到桶中。

6. 键的查找:当我们根据键来获取值时,HashMap会根据键的哈希码找到对应的桶,然后在桶中遍历链表(或红黑树)进行查找。通过键的equals()方法比较键的值,找到匹配的键值对并返回对应的值。

7. 扩容机制:当HashMap中存储的键值对数量超过容量的75%(加载因子默认值)时,HashMap会自动进行扩容。扩容会创建一个更大的数组,并将所有键值对重新分配到新的桶中,以减少哈希冲突,保持查找性能的稳定。

8. 性能分析:HashMap提供了常数时间(O(1))的存储和检索操作,具有高效的性能。但在极端情况下,如果哈希码计算不均匀或出现大量的哈希

冲突,链表或红黑树的遍历操作可能会变为线性时间(O(n))。

总体而言,HashMap通过哈希算法将键值对分散存储在数组的不同位置上,通过链表或红黑树解决哈希冲突,并提供高效的存储和检索功能。合理选择哈希函数和适当调整加载因子可以提高HashMap的性能。


http://lihuaxi.xjx100.cn/news/1207762.html

相关文章

【计算机组成原理·笔记】存储器概述

存储器概述 存储器分类 按存储介质分类 半导体存储器: TTL,MOS 小电源消失,信息丢失(易失) 磁表面存储器:硬盘磁芯存储器:光盘存储器: 按存取方式分类 存取方式与物理地址无关(…

chatgpt赋能python:Python均值函数介绍

Python均值函数介绍 Python是一种高级编程语言,非常适合数据处理和分析。在数据分析中,均值通常被用来代表一组数据的平均水平。Python提供了多种方式来计算均值,其中最常用的是使用均值函数来计算。 什么是均值函数? 均值函数…

JS回调函数(callback)

在使用Jquery的时候,用到Callback(),回调函数的概念。并且不少。javascript 好比:html $.ajax({url:"test.json",type: "GET",data: {username:$("#username").val()},dataType: "json",beforSend…

包扫描工具实现(详解)

文章目录 前言包扫描实现思路(需求分析): 具体实现完整代码 前言 注解在 Java 是一个非常重要的存在,而且它出现的非常频繁。 在一个工程下可能有许多的包或者Jar包,为了结合注解可以准确的定位到一个需要的类上&…

【期末复习之路】JAVA(三)B

接着上节,我们讲完了分支结构,我们的B部分准备讲循环结构,下文的重点请大家细细品味 文章目录 一 循环语句 二 for循环 三 while循环 四 do-while循环 五 对比三种循环结构 六 嵌套循环(或多重循环) 七 break和continue的使用 八 Sca…

MyBatis--2(基于MyBatis的增删改查)

一、准备 准备数据库表emp创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)application.properties中引入数据库连接信息:数据库连接四要素创建对应的实体类Emp(实体类属性采用驼峰命名–不留下划线)准备Mapper接口EmpMapper 二、…

2023年第十五届四川赛区ACM真题及官方题解

给大家看真题前,先给大家看看现场氛围 入场前: 结束后: 还是有点壮观的。 今年四川的ACM在都江堰举办。因为比赛时间很紧张,所以没来得及去公费旅个游哈哈, 不过题目很棒,志愿者效率很高,比赛…

PHP入门

第一章:入门 1.1 环境搭建1.2 变量和数据类型1.3 控制流程 第二章:函数 2.1 函数的定义和调用2.2 函数的参数和返回值2.3 匿名函数和闭包 第三章:数组 3.1 数组的基本操作3.2 多维数组3.3 数组函数和排序 第四章:文件操作 …