HashMap中HashCode的实现原理
代码
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
1. h >>> 16 是什么,有什么用?
h是hashcode。h >>> 16是用来取出h的高16,(>>>是无符号右移) 如下展示:
0000 0100 1011 0011 1101 1111 1110 0001
>>> 16
0000 0000 0000 0000 0000 0100 1011 0011
2.为什么 h = key.hashCode()) 与 (h >>> 16) 异或
在分析这个问题之前,我们需要先看看另一个事情, HashMap 如何根据 hash 值找到数组中的对象,我们看看 get 方法的代码:
if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);
看看代码中注释下方的一行代码:tab[(n - 1) & hash]
使用数组长度减一 与运算 hash 值。这行代码就是为什么要让前面的 hash 方法移位并异或。
我们分析一下:
首先,假设有一种情况,
对象 A 的 hashCode 为 1000010001110001000001111000000,
对象 B 的 hashCode 为 0111011100111000101000010100000。
如果数组长度是16,也就是 15 与运算这两个数, 你会发现结果都是0。这样的散列结果太让人失望了。很明显不是一个好的散列算法。
但是如果我们将 hashCode 值右移 16 位,也就是取 int 类型的一半,刚好将该二进制数对半切开。并且使用位异或运算(如果两个数对应的位置相反,则结果为1,反之为0),这样的话,就能避免我们上面的情况的发生。
目的是为了更加散列
相关文章:
HashMap中HashCode的实现原理
代码 static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}1. h >>> 16 是什么,有什么用? h是hashcode。h >>> 16是用来取出h的高16,(>>>是无符号右移) 如下展…...
Redis —Set、ZSet介绍和应用场景
Set 概念 Redis的set是一个不重复、无序并唯一的键值集合。(方便管理无序集合)它支持交集、并集、差集等等 set和list区别 List 可以存储重复元素,Set 只能存储非重复元素;List 是按照元素的先后顺序存储元素的,而…...
【产品人卫朋】内容运营:文章点击量少的可怜,该怎么做?
今天来谈谈内容运营这个话题。 随着自媒体进入视播时代,也就是短视频的时代。 无论你打开任何一个短视频应用,每一个主题下面都会有成千上万个视频。 最为致命的是,大家停留的时间也越来越短了。 如果你不能在2秒的时间内吸引眼球,…...
【K8S系列】深入解析无状态服务
目录 序言 1. 无服务介绍 1.1 优点 1.2 使用场景 1.3 资源类型 1.4 总结 2 使用介绍 2.1 Deployment 使用场景: 2.2 ReplicaSet 使用场景 2.3 pod Pod 资源定义示例 2.4 service 创建一个Deployment: 创建一个Service: 总结…...
Node基础--命令窗口
1.Windows命令行窗口(叫做:小黑屏、cmd窗口、终端、shell) (1).如何打开命令行窗口 开始菜单 -- 运行 --- cmd --- enter win R -- cmd --- enter (2).cmd窗口常用指令 dir 列出当前目录下的所有文件 cd 目录名 进入到指定的目录 md 目录名 …...
一些有趣的项目
一个支持交互的展示卷积过程的可视化工具 https://github.com/pwwang/cnn-convoluter 一款简单易用基于 Python scikit 的推荐系统https://github.com/NicolasHug/Surprise 一个封装了 7 种启发式算法的 Python 代码库。分别是:差分进化算法、遗传算法、粒子群算法…...
教你精通JavaSE语法之第六章、数组的使用
一、数组的定义与使用 😁1.1数组的概念📌数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间,可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候,需要结合隐式转换考虑。比如࿱…...
基于51单片机AT89C51的小型音乐喷泉控制系统设计
wx供重浩:创享日记 对话框发送:单片机小喷泉 获取完整无水印论文报告(内含电路原理图和程序) 根据目前音乐喷泉的发展现状,介绍了一个以AT89C51单片机为核心的小型音乐喷泉控制系统。给出了一个简洁的单片机控制电路&a…...
【Nacos】Nacos原理详解(注册中心,配置中心)
文章目录一、背景二、CAP理论三、什么是NacosNacos 服务注册需要具备的能力:Nacos的实现原理:四、Nacos原理Nacos 服务注册与订阅的完整流程服务领域模型五、注册中心原理六、配置中心原理七、Nacos 的关键特性包括:八、 面试分析一、背景 服务注册中心…...
蓝桥杯刷题冲刺 | 倒计时11天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.质因子2.蓝桥王国1.质因子 题目 链接: 1545. 质因子 - AcWing题库 给定一个整数 N…...
【新】(2023Q2模拟题JAVA)华为OD机试 - 时间格式化
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:时间格式化 题目 运维工程师…...
MySQL函数
函数 MySQL函数与其存储过程类似,是一系列完成某种功能的SQL语句。函数一旦定义后,与过程一样是存储在MySQL的服务器上。调用函数就是一次性执行这些语句。所以函数可以降低语句重复。 MySQL本身提供了内置函数,这些函数的存在给我们日常的开…...
【Linux系统】开发工具(下) {调试器gdb,自动化构建工具make/Makefile,多文件编译,代码管理平台git}
【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的三种基本模式,vim指令集,代码编译器gcc/g} 四、Linux调试器:gdb 4.1 debug模式 程序的编译模式有两种,debug模式和…...
线性代数——行列式
文章目录版权声明排列行列式行列式的由来行列式的概念行列式的性质重要公式克拉默法则补充知识版权声明 本文大部分内容皆来自李永乐老师考研教材和视频课。 排列 由1,2,…,n1,2,\ldots,n1,2,…,n组成的有序数组称为一个nnn阶排列,通常使用j1j2…jnj_1j_2\ldots …...
Spring注解-Spring-boot-SpingAOP
Spring各个模块 Test 对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节. Core Container Spring的核心组件, 包含了Spring框架最基本的支撑. Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包. Core, 对应spring-core.jar,…...
使用Shell传参解决DataPhin中PySpark不支持中文的问题
使用Shell传参解决DataPhin中PySpark不支持中文的问题 背景 笔者开发PySpark任务时【别问为神马不用Java和Scala打Jar包的方式,PySpark不需要打包所以开发效率极高,早点搞完早点下班】,遇到一个令所有SQL Boy都很头疼的问题,那就…...
【CDH】cloudera manger 如何开启Debug 日志调试模式
前言 在安装 Cloudera Manger 时,遇到报错,需要开启Debug 日志级别来排查下问题原因。这里记录下 CM 如何开启 Debug 级别。 方法一:为整个服务启动DEBUG 如果 CM 无法启动,则可以为整个服务器启用 DEBUG 或 TRACE。 警告&…...
SQL Server 用户授权与回收
创建xxbbbb账号,账号可以在Company_report20221019.dbo.qfacccmprf表中进行select、 insert,update,delete --创建登录账号 create login xxbbbb with password12345#---创建用户 use Company_report20221019 create user xxbbbb for login xxbbbb---将qfacccmprf表…...
电脑出现乱码的原因以及解决方法
在日常使用电脑的过程中,经常会遇到电脑出现乱码,那么为什么会出现乱码呢?出现乱码又该怎么解决呢?下面我们一起来了解一下。 出现乱码的原因 系统乱码:主要是Windows中显示乱码,比如菜单、桌面、启动界面…...
网络工程师笔记
第一天: 编码就是转化为数字信号;调制就是转化为模拟信号; 调制: 1、基带调制(不改变频率,只改变波形) 2、带通调制(迁移到较高的频段进行传输) (1&…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
