怀化建设公司网站/google官方下载app

怀化建设公司网站,google官方下载app,javascript数据类型,2023年山东疫情最新消息📌《每天读一个JDK源码》之HashMap解读 🔗源码定位:java.util.HashMap(建议IDE对照阅读) 今天我们来破解Java集合框架中最精妙的艺术品——HashMap!它不仅是面试必考题(出现率99%)&…

📌《每天读一个JDK源码》之HashMap解读

🔗源码定位:java.util.HashMap(建议IDE对照阅读)

image-20250301234723624

今天我们来破解Java集合框架中最精妙的艺术品——HashMap!它不仅是面试必考题(出现率99%),更是理解数据结构设计的绝佳范例。准备好了吗?让我们开启这段源码探险之旅!🚀


🧩 源码全景地图(JDK1.8版)

// 🌈 核心数据结构
transient Node<K,V>[] table; // 哈希桶数组(长度总是2的幂)
static class Node<K,V> implements Map.Entry<K,V> {final int hash; // 🧬 关键字段1:扰动后的哈希值final K key;    // 🧬 关键字段2V value;Node<K,V> next; // 1.8保留链表结构
}// 🌳 红黑树节点(当链表长度≥8时转换)
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> {TreeNode<K,V> parent;  TreeNode<K,V> left;TreeNode<K,V> right;TreeNode<K,V> prev;    // 维持双向链表特性
}

🔥 核心实现原理

💡 哈希算法演进史
// JDK1.7的扰动函数(4次位运算+5次异或)
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);// JDK1.8优化(1次位运算+1次异或)
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

(图示:扰动函数将高位特征融入低位,减少哈希碰撞)


⚔️ 哈希冲突解决方案对比
特性JDK1.7JDK1.8
数据结构数组+单向链表数组+链表/红黑树
插入方式头插法(多线程成环风险)尾插法(解决死链问题)
树化阈值链表长度≥8且桶数量≥64
退化阈值树节点≤6时退化为链表

🌪️ 扩容机制源码解析(JDK1.8)
final Node<K,V>[] resize() {// 旧容量翻倍(必须保持2的幂)newCap = oldCap << 1; // 重新分配节点(精妙之处!)if (e.next == null) // 单节点newTab[e.hash & (newCap - 1)] = e;else if (e instanceof TreeNode) // 树节点拆分((TreeNode<K,V>)e).split(this, newTab, j, oldCap);else { // 链表优化重组(不需要重新计算哈希!)Node<K,V> loHead = null, loTail = null; // 低位链Node<K,V> hiHead = null, hiTail = null; // 高位链do {// 判断是否需要移动的魔法公式:if ((e.hash & oldCap) == 0) { ... }} while ((e = next) != null);}
}

(扩容时链表节点通过hash & oldCap判断是否需要移动,时间复杂度从O(n)降为O(1))


🧩 扩容过程介绍

截自某平台的的评论区

image-20250301234914645

🚨 并发问题深度警示

// JDK1.7头插法导致死链的典型场景
void transfer(Entry[] newTable) {Entry<K,V> e = src[j];while (e != null) {Entry<K,V> next = e.next;int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; // ❌多线程可能形成循环引用newTable[i] = e;e = next;}
}

(1.8改用尾插法+红黑树重组策略,但HashMap仍是非线程安全的!)


🎯 高频面试题精选

  1. 为什么负载因子默认0.75?(空间与时间的平衡点)
  2. 为什么树化阈值是8?(泊松分布计算,链表长度=8的概率仅0.000006%)
  3. 为什么用红黑树不用AVL树?(综合查询与更新效率)
  4. 为什么容量必须是2的幂?(通过(n-1) & hash快速定位桶)

🌟 版本对比总结表

对比维度JDK1.7JDK1.8
数据结构数组+链表数组+链表/红黑树
哈希计算9次位扰动2次位扰动
节点插入头插法尾插法
扩容后索引计算全部重新计算hash利用高位bit判断
最大容量1<<301<<30(但实际受VM限制)

🔍 LeetCode实战推荐

  1. 两数之和(HashMap经典应用)
  2. 设计哈希集合(实现原理练习)
  3. LRU缓存机制(LinkedHashMap实战)
  4. 字母异位词分组(哈希设计技巧)

💬 灵魂拷问:为什么HashMap的树化不直接采用整个哈希表结构树化?欢迎在评论区留下你的思考!💡 🚀 下期关键词预告:#线程安全 #CAS机制 #分段锁 #并发度优化 #sizeCtl控制

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

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

相关文章

【Java项目】基于SpringBoot的Java学习平台

【Java项目】基于SpringBoot的Java学习平台 技术简介&#xff1a;采用Java技术、SpringBoot框架、MySQL数据库等实现。系统基于B/S架构&#xff0c;前端通过浏览器与后端数据库进行信息交互&#xff0c;后端使用SpringBoot框架和MySQL数据库进行数据处理和存储&#xff0c;实现…

使用ChatGPT-Deep Reaserch两步给出文献综述!

文献综述是学术论文写作中不可或缺的一部分&#xff0c;它不仅是对已有研究的梳理和总结&#xff0c;更是为后续研究奠定理论基础的关键步骤。通过文献综述研究者能够全面了解当前研究领域的现状、主要观点和研究方法&#xff0c;从而找到自己研究的切入点和创新点。这一过程需…

综合实验处理表格

新建excel表格&#xff0c;输入信息&#xff0c;另存为csv文件。 利用notepad打开csv文件&#xff0c;可以观察格式 目标&#xff1a;通过编程处理文件&#xff0c;实现对数据的处理&#xff0c;成绩求和以及评价 对数据逐行处理&#xff0c;读一行&#xff0c;处理一行&#…

我和我的通义灵码

我和我的通义灵码 我和我的通义灵码个人版&企业版个人版登录个人版workspace应用场景terminal 企业版登录企业版#team docs 体验总结 我和我的通义灵码 说到通义灵码&#xff0c;作为程序员的我们是最有发言权的。从全国首个AI代码助手-通义灵码公测到现在&#xff0c;不知…

Java测试框架Mockito快速入门

Mockito结合TestNG快速入门 什么是Mockito Mockito 是一个专门用于 Java 的强大测试框架&#xff0c;主要用来创建和管理模拟对象&#xff0c;辅助开发者进行单元测试&#xff0c;具有以下特点和功能&#xff1a; 创建模拟对象&#xff1a;能通过简洁的语法创建类或接口的模…

week 3 - More on Collections - Lecture 3

一、Motivation 1. Java支持哪种类型的一维数据结构&#xff1f; Java中用于在单一维度中存储数据的数据结构&#xff0c;如arrays or ArrayLists. 2. 如何在Java下创建一维数据结构&#xff1f;&#xff08;1-dimensional data structure&#xff09; 定义和初始化这些一…

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口&#xff0c;STBY置0电机全部停止&#xff0c;置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端&#xff08;AIN1与AIN2&#xff09;只能控制AO1与…

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

零样本思维链(Zero-shot CoT)

Large Language Models are Zero-Shot Reasoners (Kojima et al., 2022) 这篇文章研究了大型语言模型 (LLMs) 在推理任务上的能力&#xff0c;并提出了一种名为 Zero-shot-CoT 的新方法&#xff0c;该方法能够有效地引导 LLM 进行多步骤推理&#xff0c;并在各种推理任务上取得…

day01_Java基础

文章目录 day01_Java基础一、今日课程内容二、Java语言概述&#xff08;了解&#xff09;1、Java语言概述2、为什么要学习Java语言3、Java平台版本说明4、Java特点 三、Java环境搭建&#xff08;操作&#xff09;1、JDK和JRE的概述2、JDK的下载和安装3、IDEA的安装4、IDEA的启动…

Spring Boot 项目开发流程全解析

目录 引言 一、开发环境准备 二、创建项目 三、项目结构 四、开发业务逻辑 1.创建实体类&#xff1a; 2.创建数据访问层&#xff08;DAO&#xff09;&#xff1a; 3.创建服务层&#xff08;Service&#xff09;&#xff1a; 4.创建控制器层&#xff08;Controller&…

数据结构课程设计(java实现)---九宫格游戏,也称幻方

【问题描述】 九宫格&#xff0c;一款数字游戏&#xff0c;起源于河图洛书&#xff0c;与洛书是中国古代流传下来的两幅神秘图案&#xff0c;历来被认为是河洛文化的滥觞&#xff0c;中华文明的源头&#xff0c;被誉为"宇宙魔方"。九宫格游戏对人们的思维锻炼有着极大…

GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作

GPT-4.5 怎么样&#xff1f;如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作 今天我们来说说上午发布的GPT-4.5&#xff0c;接下来我们说说GPT4.5到底如何&#xff0c;有哪些功能&#xff1f;有哪些性能提升&#xff1f;怎么快速使用到GPT-4.…

【vscode-解决方案】vscode 无法登录远程服务器的两种解决办法

解决方案一&#xff1a; 查找原因 命令 ps ajx | grep vscode 可能会看到一下这堆信息&#xff08;如果没有大概率不是这个原因导致&#xff09; 这堆信息的含义&#xff1a;当你使用 vscode 远程登录服务器时&#xff0c;我们远程机器服务端要给你启动一个叫做 vscode serv…

一、对4*3按键模块编程分析

一、4*3键盘模块实物分析 说明&#xff1a; 1、横着4排&#xff0c;竖着3列&#xff0c;加起来共7组&#xff0c;所以对外引出7根线。 2、根据排针终端引脚又可分两类。即横排和竖列对应的引脚。 二、代码编写构想&#xff1a; 1、使用7个gpio输入中断&#xff0c;检测7个…

DeepSeek实战

DeepSeek 接入实战&#xff1a;从零开始快速上手 引言 在当今的 AI 领域&#xff0c;DeepSeek 作为一个强大的自然语言处理&#xff08;NLP&#xff09;平台&#xff0c;提供了丰富的 API 接口&#xff0c;帮助开发者快速实现智能对话、文本生成、语义分析等功能。本文将带你…

【告别双日期面板!一招实现el-date-picker智能联动日期选择】

告别双日期面板&#xff01;一招实现el-date-picker智能联动日期选择 1.需求背景2.DateTimePicker 现状图3.日期选择器实现代码4.日期选择器实现效果图5.日期时间选择器实现代码6.日期时间选择器实现效果图 1.需求背景 在用户使用时间查询时&#xff0c;我们经常需要按月份筛选…

Linux(ftrace)__mcount的实现原理

Linux 内核调试工具ftrace 之&#xff08;_mcount的实现原理&#xff09; ftrace 是 Linux 内核中的一种跟踪工具&#xff0c;主要用于性能分析、调试和内核代码的执行跟踪。它通过在内核代码的关键点插入探针&#xff08;probe&#xff09;来记录函数调用和执行信息。这对于开…

tauri2+typescript+vue+vite+leaflet等的简单联合使用(一)

项目目标 主要的目的是学习tauri。 流程 1、搭建项目 2、简单的在项目使用leaflet 3、打包 准备项目 环境准备 废话不多说&#xff0c;直接开始 需要有准备能运行Rust的环境和Node&#xff0c;对于Rust可以参考下面这位大佬的文章&#xff0c;Node不必细说。 Rust 和…

关于流水线的理解

还是不太理解&#xff0c;我之前一直以为&#xff0c;对axis总线&#xff0c;每一级的寄存器就像fifo一样&#xff0c;一级一级的分级存储最后一级需要的数据。 像这张图&#xff0c;一开始是在解析axis流形式的数据包&#xff0c;数据包一直都能输入&#xff0c;所以valid一直…