HashMap详解

ops/2024/11/20 13:14:35/

HashMap是使用数组+链表的数据结构进行数据的存储,后来演变到jdk8之后,为了提高插入和查询效率,在插入的数据超过某个阀值之后,会将数组+链表的结构转化为数组+红黑树的数据结构。

1.初始化 

1.1初始化

当我们执行下面的代码时

java">  HashMap<String,Integer> map = new HashMap<>();

  我们从底层代码发现是对其内部的一个loadFactor属性进行了初始化,默认值为0.75,那么我们为什么要初始化loadFactor参数呢?这个loadFactor参数具体是干什么的呢?

HashMap是用的一个数组+链表的形式进行数据的存储,那么这个数组的长度是如何决定的呢?我们用什么来判断要对数组进行扩容/缩减呢?这个判断依据就是根据loadFactor来决定的。当插入数据的个数/数组的长度>=loadFactor时,我们就要对数组的长度进行扩展。因为当插入的数据越来越大的时候,在数组长度不变的情况下hash冲突会越来越严重,数组节点下的数据就会越来越多,进而导致查询效率越来越差。

在扩展数组的时候,数组的长度都是2^n个,在初始化的时候,数组长度是2^4=16,每一次扩展,都增加一倍。

1.2插入第一条数据

java">    map.put("apple",2);

当我们执行这条操作的时候

第一步:先计算字符串"apple"的hash值,作为判断插入数据在哪个节点的依据。

第二步:初始化数组表table,第一次初始化的时候,数组表table的长度是2^4=16

 第三步:用"apple"的hash值和数组table的长度(n-1)做且运算,判断当前数据应该插在数组的哪个位置(注:做且运算时确保数据插入位置是在[0,n-1]之间,保证数组不会越界)

java">if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);

第四步:size字段+1,并判断是否超阀值threshold,则进行数组table扩展,且以后每插入一条数据,都会进行阀值判断。(注:threshold = 当前数组table的长度 *loadFactor)

java">if (++size > threshold)resize();


http://www.ppmy.cn/ops/135243.html

相关文章

【环境配置】ubuntu-jetson上的定时任务

使用 crontab 制定定时任务 目标 每分钟清理当前分钟之前的图片。 [可选]每小时清理当前小时之前的图片。 [可选]每天清理当前日期之前的图片。 [可选] 环境 操作系统&#xff1a;Ubuntu 22.04 (jetson)需要清理的文件夹&#xff1a;/home/nvidia/install/Snapshot 步骤 …

HTTP代理是什么,有什么用?

在互联网的世界里&#xff0c;数据采集已经成为许多企业和个人获取信息的重要手段。而在这个过程中&#xff0c;HTTP代理则是一个不可或缺的工具。那么&#xff0c;HTTP代理究竟是什么&#xff1f;它在数据采集中又有什么用呢&#xff1f;今天&#xff0c;我们就来深入探讨一下…

基于BERT的命名体识别(NER)

基于BERT的命名实体识别&#xff08;NER&#xff09; 目录 项目背景项目结构环境准备数据准备代码实现 5.1 数据预处理 (src/preprocess.py)5.2 模型训练 (src/train.py)5.3 模型评估 (src/evaluate.py)5.4 模型推理 (src/inference.py) 项目运行 6.1 一键运行脚本 (run.sh)6…

语义分割(semantic segmentation)

语义分割(semantic segmentation) 文章目录 语义分割(semantic segmentation)图像分割和实例分割代码实现 语义分割指将图片中的每个像素分类到对应的类别&#xff0c;语义区域的标注和预测是 像素级的&#xff0c;语义分割标注的像素级的边界框显然更加精细。应用&#xff1a…

Flutter:key的作用原理(LocalKey ,GlobalKey)

第一段代码实现的内容&#xff1a;创建了3个块&#xff0c;随机3个颜色&#xff0c;每次点击按钮时&#xff0c;把第一个块删除 import dart:math; import package:flutter/material.dart; import package:flutter_one/demo.dart;void main() {runApp(const App()); }class App…

Spring Boot教程之三:Spring Boot 与 Spring MVC 及 Spring的区别

Spring Boot 与 Spring MVC 的区别 Spring MVC&#xff1a; Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序&#xff0c;Spring 提供了 Spring MVC 框架&#xff0c;它是 Spring 的一个广泛使用的模块&#xff0c;用于创建可扩展的 Web 应用程序。Spring MVC 框架支…

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)

文章目录 &#x1f4af;前言&#x1f4af;C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 &#x1f4af; std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_stdio(false)2.2 使用 std::ios::sync_with_stdio(false) 的示…

安全见闻4

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…