概念

HashMap是java中一种非常常用的基于哈希表的数据结构,允许o(1)

的时间复杂度进行元素插入,查找,和删除。它通过”键-值“ 对的方式存储数据。

总的来说:HashMap的底层原理:数组+链表+红黑树(jdk1.8之后还涉及红黑树)。

哈希函数与哈希值:每个键都会通过哈希函数计算哈希值,然后通过哈希值决定数组在那个桶(buxket)中。桶是一个数组的存储位置。

数组:hashmap底层是一个数组,每个数组元素存放一个链表或者红黑树(1.8之后)

当新元素插入hashmap时,它首先根据哈希值找到数组中的某个位置(桶)。如果该位置为空,则

则直接插入;如果该位置已经存在了元素(发生碰撞),链表或红黑树解决冲突。

hash冲突——链表和红黑树:

如果发生哈希冲突,hashMap会将相同的哈希值的元素以链表的形式存储在一个桶中(数组的某个位置)。

当链表长度过长时候,时间复杂度变为O(n).当链表长度超过一定的阈值(默认是8)时,链表会转换为红黑树,从而将时间复杂度从O(n)降低到O(log n).

负载因子和扩容:

Hash Map有一个重要的参数叫负载因子,它决定了当数组中元素数量超过数组容量的多大比例时,会触发扩容操作。默认负载因子是0.75,当HashMap的元素数量达到数组容量的75%时,HashMap会自动扩容,通常会将数组容量扩展为原来的2倍。扩容时,HashMap会重新分配一个更大的数组,并将原来的数组映射到新的数组中,这个过程叫做rehashing。过程比较耗时,因为要重新计算每个元素的哈希值,并将其放入桶中。

源码分析:

HashMap 的默认初始化容量是 16,负载因子是 0.75。

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
static final float DEFAULT_LOAD_FACTOR = 0.75f;

HashMap 的 put 方法是插入元素的核心逻辑。
hash() 方法计算键的哈希值。为了减少哈希冲突,它通过异或运算将高位信息与低位结合,混合高位与低位的位信息.

public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}

static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

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

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

相关文章

Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法

Ubuntu24 辅助系统-屏幕键盘的back按键异常 问题描述ubuntu24这个屏幕键盘&#xff0c;只有在网页的搜索框或者文本框&#xff0c;比如百度首页的搜索框&#xff0c;留言的文本框&#xff0c;才会出现点击back按钮的时候&#xff0c;出现了先选中当前这个字符&#xff0c;删除此…

自然语言指令驱动的工业机器人协同学习系统:大语言模型如何重塑智能体协作范式

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

web:js的switch语句

在js中,switch语句是一种用于根据不同的条件执行不同代码块的控制流语句。它类似于多个if...else if...else语句,但结构更清晰,特别是在有多个条件分支的情况下。 基本语法 switch (expression) {case value1:// 当expression的值等于value1时执行这里的代码break;case va…

为何说分布式 AI 推理已成为下一代计算方式

2024 年&#xff0c;我们见证了人工智能创新的空前爆发。AI 的快速发展令很多人惊叹&#xff0c;为了训练更先进的大语言模型&#xff08;LLM&#xff09;&#xff0c;科技巨头争相获取强大的 GPU。如今&#xff0c;AI 正在无缝融入我们世界的每个角落。在众多新兴 AI 公司、模…

阿里云 RabbitMQ 可观测性最佳实践

阿里云 RabbitMQ 阿里云 RabbitMQ 是一款高性能、高可靠的消息中间件&#xff0c;支持多种消息协议和丰富的功能特性。它提供消息队列功能&#xff0c;能够实现应用间的消息解耦和异步通信&#xff0c;提升系统扩展性和稳定性。其支持多种消息持久化策略&#xff0c;确保消息不…

vue-router 导航式编程 参数的设置

主要是想记录一下this.$router.push、replace、go等方法的参数如何设置。字符串路径router.push(/home)直接使用字符串&#xff08;或模板字符串&#xff09;路径&#xff0c;可跳转到相应的URL路径。对象式路径路径也可以是一个对象&#xff0c;对象里以key:value的形式表示UR…

Swift实现股票图:从基础到高级

目录一、核心实现方案1. 原生方案&#xff1a;使用 Core Graphics 绘制2. 使用第三方库&#xff1a;Charts3. 跨平台方案&#xff1a;使用 SwiftUI Canvas二、技术指标实现1. 移动平均线 (MA)2. 布林带 (Bollinger Bands)3. MACD (Moving Average Convergence Divergence)三、…

【unitrix】 6.4 数特征(number.rs)

一、源码 这段代码定义了一个名为Number的trait&#xff08;特质&#xff09;以及它的实现。 use crate::sealed::Sealed; use crate::number::{V, BaseNumber, TNumber};/// 数值的统一标记特质 /// 可以是编译时类型化数字(TNumber)或运行时变量(V<T>) pub trait Numbe…

AI治AI:大语言模型自检新法

“以火攻火”的思路解决大语言模型(LLMs)“幻觉”问题 虚构是由于与提示无关的内部因素而不可预测地从 LLM 中出现的幻觉。作者专注于衡量 LLM 对提示响应的不确定性,使用高不确定性表示虚构的假设。他们通过计算一个称为熵的量来估计这种不确定性**,熵可以被认为是模型生…

ESLint 配置错误:ReferenceError: prettier is not defined 解决方案

问题描述在使用 pnpm lint 运行 ESLint 时&#xff0c;出现以下错误&#xff1a;Oops! Something went wrong! :( ESLint: 9.31.0 ReferenceError: prettier is not defined该错误导致 ESLint 无法正确执行代码格式检查&#xff0c;但 不会影响项目的实际运行&#xff08;如 pn…

数据结构--准备知识

一.算法效率算法效率分为两种&#xff1a;第一种为时间效率&#xff0c;第二种为空间效率。时间效率称为时间复杂度&#xff0c;空间效率称为空间复杂度。时间复杂主要衡量一个算法的运行速度&#xff0c;空间复杂度主要衡量一个算法所需的 额外的空间&#xff08;现在不需要特…

HTML 入门教程:从零开始学习网页开发基础

一、HTML简介 1.1 什么是HTML&#xff1f; HTML全称是Hyper Text Markup Language&#xff08;超文本标记语言&#xff09;&#xff0c;由Tim Berners-Lee和同事Daniel W. Connolly于1990年创立。它是一种用于创建网页的标准标记语言&#xff0c;而不是编程语言。 1.2 HTML的…

使用 bat 批量创建带有项目前缀名的文件夹结构

在项目管理中&#xff0c;经常需要为每个新项目创建一套标准化的文件夹结构。如文档中所述&#xff0c;用户希望为每个项目&#xff08;如"Project 1"、“Project 2”&#xff09;创建以下结构的文件夹&#xff1a; project-1_export\project-1_DWG project-1_expo…

Python类中魔术方法(Magic Methods)完全指南:从入门到精通

文章目录Python类中魔术方法(Magic Methods)完全指南&#xff1a;从入门到精通一、魔术方法基础1. 什么是魔术方法&#xff1f;2. 魔术方法的特点二、常用魔术方法分类详解1. 对象创建与初始化2. 对象表示与字符串转换3. 比较运算符重载4. 算术运算符重载5. 容器类型模拟6. 上下…

H3CNE综合实验之五角星

H3CNE综合实验之五角星 实验拓扑图交换机地址规划表&#xff1a;SW6G1/0/1Vlan100:10.1.3.2/24G1/0/2Vlan90:10.1.4.2/24G1/0/3Vlan50:10.1.5.1/24G1/0/4Vlan60&#xff1a;10.1.6.1/24SW7G1/0/1Vlan50:10.1.5.2/24G1/0/2Vlan30:192.168.3.1/24G1/0/6Vlan70:10.1.1.2/24G1/0/3-…

Android EventBus使用方法与底层原理详解

EventBus 是什么&#xff1f; EventBus 是一个基于发布/订阅&#xff08;Publish/Subscribe&#xff09; 模式的开源库&#xff08;主要由 greenrobot 开发维护&#xff09;。它的核心目的是简化 Android 应用中不同组件&#xff08;如 Activity, Fragment, Service, Thread 等…

初等数论简明教程

初等数论简明教程 本文给出初等数论中的一些重要的定理与例题&#xff0c;证明风格采用 整除线法 与 命题节点法。 整除线法 指推理的第 nnn 步左边的字符可由前面左边的字符得到&#xff0c;右边的字符可由前面右边的字符得到&#xff0c;整除线变成了推理线&#xff0c;既少…

Spring之核心容器(IoC,DI,基本操作)详解

Spring之核心容器IoC/DI/基本操作详解一、核心概念&#xff1a;IoC与DI的本质1.1 IoC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;传统开发模式&#xff08;无IoC&#xff09;IoC模式&#xff08;Spring容器管理&#xff09;1.2 DI&#xff08;Dependenc…

【论文阅读】基于注意力机制的冥想脑电分类识别研究(2025)

基于注意力机制的冥想脑电分类识别研究&#x1f4a1; Meta DataTitle基于注意力机制的冥想脑电分类识别研究Authors周梓涵Pub. date2025&#x1f4dc; Research Background & Objective背景&#xff1a; 现代生活压力导致心理问题日益突出&#xff0c;冥想作为一种有效的心…

GitHub 上 Star 数量前 8 的开源 Web 应用项目

原文链接&#xff1a;https://www.nocobase.com/cn/blog/github-open-source-web-applications。 近期&#xff0c;我们发布了多篇「Top GitHub Star 开源项目推荐」系列文章&#xff0c;受到了大量点赞与收藏&#xff0c;很多开发者留言表示希望能看到更多不同领域的开源工具推…