hashCode 和对象的内存地址

article/2025/9/30 5:01:52

hashCode

文章目录

    • hashCode
      • hashCode 的生成逻辑
      • 第 0 种算法
      • 第 1 种算法
      • 第 2 种算法
      • 第 3 种算法
      • 第 4 种算法
      • 第 5 种算法

根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。

    public static void main(String[] args) {Object o = new Object();System.out.println(o);int hashCode = o.hashCode();//hashCode 16进制System.out.println(Integer.toHexString(hashCode));System.out.println(hashCode);//获取hashCodeSystem.out.println(System.identityHashCode(o));}

在这里插入图片描述

@后面的为16进制的hashCode

hashCode 的生成逻辑

openjdk 源码里生成 hashCode 的核心方法

static inline intptr_t get_next_hash(Thread * Self, oop obj) {  intptr_t value = 0 ;  if (hashCode == 0) {  // This form uses an unguarded global Park-Miller RNG,  // so it's possible for two threads to race and generate the same RNG.  // On MP system we'll have lots of RW access to a global, so the  // mechanism induces lots of coherency traffic.  value = os::random() ;  } else  if (hashCode == 1) {  // This variation has the property of being stable (idempotent)  // between STW operations.  This can be useful in some of the 1-0  // synchronization schemes.  intptr_t addrBits = intptr_t(obj) >> 3 ;  value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;  } else  if (hashCode == 2) {  value = 1 ;            // for sensitivity testing  } else  if (hashCode == 3) {  value = ++GVars.hcSequence ;  } else  if (hashCode == 4) {  value = intptr_t(obj) ;  } else {  // Marsaglia's xor-shift scheme with thread-specific state  // This is probably the best overall implementation -- we'll  // likely make this the default in future releases.  unsigned t = Self->_hashStateX ;  t ^= (t << 11) ;  Self->_hashStateX = Self->_hashStateY ;  Self->_hashStateY = Self->_hashStateZ ;  Self->_hashStateZ = Self->_hashStateW ;  unsigned v = Self->_hashStateW ;  v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;  Self->_hashStateW = v ;  value = v ;  }  value &= markOopDesc::hash_mask;  if (value == 0) value = 0xBAD ;  assert (value != markOopDesc::no_hash, "invariant") ;  TEVENT (hashCode: GENERATE) ;  return value;  
}  

从源码里可以发现,生成策略是由一个 hashCode 的全局变量控制的,默认为5;而这个变量的定义在另一个头文件里:

product(intx, hashCode, 5,                                              "(Unstable) select hashCode generation algorithm" )   

在这里插入图片描述

第 0 种算法

if (hashCode == 0) {  // This form uses an unguarded global Park-Miller RNG,  // so it's possible for two threads to race and generate the same RNG.  // On MP system we'll have lots of RW access to a global, so the  // mechanism induces lots of coherency traffic.  value = os::random();  }  

这种生成算法,使用的一种Park-Miller RNG的随机数生成策略。不过需要注意的是……这个随机算法在高并发的时候会出现自旋等待

第 1 种算法

if (hashCode == 1) {  // This variation has the property of being stable (idempotent)  // between STW operations.  This can be useful in some of the 1-0  // synchronization schemes.  intptr_t addrBits = intptr_t(obj) >> 3 ;  value = addrBits ^ (addrBits >> 5) ^ GVars.stwRandom ;  
}  

这个算法,真的是对象的内存地址了,直接获取对象的 intptr_t 类型指针只不过封装了一下数字。

第 2 种算法

if (hashCode == 2) {  value = 1 ;            // for sensitivity testing  
}  

value = 1

第 3 种算法

if (hashCode == 3) {  value = ++GVars.hcSequence ;  
}  

递增

第 4 种算法

{value = intptr_t(obj) ;  
}

真实的指针地址

第 5 种算法

     // Marsaglia's xor-shift scheme with thread-specific state  // This is probably the best overall implementation -- we'll  // likely make this the default in future releases.  unsigned t = Self->_hashStateX ;  t ^= (t << 11) ;  Self->_hashStateX = Self->_hashStateY ;  Self->_hashStateY = Self->_hashStateZ ;  Self->_hashStateZ = Self->_hashStateW ;  unsigned v = Self->_hashStateW ;  v = (v ^ (v >> 19)) ^ (t ^ (t >> 8)) ;  Self->_hashStateW = v ;  value = v ;  }

http://chatgpt.dhexx.cn/article/9MsQK8mj.shtml

相关文章

HashCode

HashCode 文章目录 HashCode前言Hash是什么&#xff1f;HashCodeHashCode关键点判断两个对象相等 前言 Hash是什么&#xff1f; 哈希函数 把任意长度的输入通过散列算法变换成固定长度的输出&#xff0c;该输出就是散列值&#xff0c;是一种压缩映射。 hash是一个函数&#…

java中equals,hashcode和==的区别

2019独角兽企业重金招聘Python工程师标准>>> 1、== java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型 byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值。 2.引用类型(类、接口、数组) 当…

hashcode讲解【最详细版本】

Object 基类 Object 含有的方法 hashCode 作用&#xff1a;用于查找的快捷性&#xff0c;常用于确定对象的存储地址 如 Hashtable&#xff0c;HashMap 默认情况下&#xff0c;Object中的hashCode() 返回对象的32位jvm内存地址。 如果两个对象相同&#xff0c; equals方法一…

hashcode详解

前言 HashCode是在Java中用于获取对象的唯一标识符的方法。它是根据对象的内容生成的一个整数值。对象的hashCode()方法被调用时&#xff0c;它返回的是对象的哈希码。哈希码可以用于在哈希表等数据结构中快速定位对象。 在Java中&#xff0c;hashCode()方法是被Object类定义…

真正搞懂hashCode和hash算法

本人当初刚接触java的时候一说到hash算法或者hashCode也是蛋蛋疼&#xff0c;两只都疼 后来花了整整一天时间来研究hash&#xff0c;搞懂后发现其实也不难理解&#xff0c;时隔一年突然想起来&#xff0c;写篇博客记录下&#xff1b; 以前我莫得选择&#xff0c;现在我想搞懂…

腾讯_TEG一面

总结 不愧是腾讯内部技术含量较高的部门&#xff0c;上来怼基础。总体有套路可循&#xff0c;比较偏技术

腾讯技术解读|TEG—硬核拆解,腾讯产品的底层技术牛在哪里?

技术&#xff0c;是各个事业群的核心力量 然而&#xff0c;事业群的不同&#xff0c;核心力量也不同 你是否还在纠结事业群的选择&#xff1f; 担心对事业群不了解而选错事业群&#xff1f; 毫无疑问 技术也是事业群选择的重要衡量因素之一哦&#xff01; 对此&#xff0c…

15 年腾讯老兵谈技术人成长之路

作者&#xff1a;alexguo&#xff0c;腾讯TEG技术总监&技术专家 每个职场人都会经历从职场新人到骨干、专家亦或是管理者的蜕变过程。作为技术职业人&#xff0c;大家常会碰到一些困惑&#xff0c;在不同职业发展阶段所需要具备的认知和专业能力差异在哪里&#xff1f;除了…

腾讯TEG客户端开发面经

2022年秋招/春招/提前批/大厂面经整理&#xff08;持续更新中~&#xff09; 腾讯TEG客户端开发面经 2021/05/19下午两点半初试 1、面试官先让做自我介绍&#xff0c;主要介绍项目&#xff0c;简短一点不需要太详细。 ------我大概讲了一下我的三个项目&#xff0c;第一个是高…

腾讯TEG首次集体亮相腾讯全球数字生态大会,这些亮点不容错过!

5月21日—23日&#xff0c;腾讯全球数字生态大会将在昆明滇池国际会展中心召开。大会是将腾讯过往的三大峰会“腾讯全球合作伙伴大会”、“腾讯云未来峰会”和“互联网数字经济峰会”进行有机整合&#xff0c;届时&#xff0c;众多行业领袖、技术领军人物、国际知名数字经济研究…

粉丝投稿!大三参加校招三面腾讯TEG实习岗面经分享,希望对大家有帮助!(已拿意向书)

背景介绍 背景&#xff1a;本科大三&#xff0c;末流211&#xff0c;计科专业&#xff0c;寒假在某bat一家实习 腾讯流程好快&#xff0c;从面到结束一周拿意向书&#xff0c;3.18开始一面&#xff0c;3.25拿到意向书 一面 75min 自我介绍学校做的项目有没有什么优点&#x…

TEG《选择》乘风破浪 · 披荆斩棘

等灯等灯&#xff5e; 今夜&#xff0c;TEG《选择》在新年晚会闪亮登场 听说有人夸我们大歌舞大排面&#xff08;蟹蟹&#xff09; 其实咱剧情还搭载着回忆与梦境、理想与现实 来&#xff0c;他二哥就好好跟大家唠嗑唠嗑这《选择》 选择音乐剧 几句话概括我们的故事主线&#x…

什么是IEGT?

1980年前后&#xff0c;通用公司的B•贾扬•巴利加发明了IGBT&#xff0c;解决了当时MOSFET和普通双极功率晶体管无法解决的问题。但随着产品的发展&#xff0c;大家发现了这种新型器件拥有静态损耗的问题。于是东芝半导体的工程师就在上个世纪九十年代率先实现了栅极注入增强&…

关于【腾讯 TEG云架构平台部( 云架平) 存储组】

这算是个简单的辟谣帖吧 本人21届新人&#xff0c;入职快半年了&#xff0c;之前也在这边实习过半年&#xff0c;几乎不怎么看脉脉&#xff0c;但最近看到一些黑帖&#xff0c;本不想回复&#xff0c;但是考虑到自己也是应届生过来的&#xff0c;刚拿到offer肯定忍不住想从各方…

Carla自动驾驶仿真三:Traffic Manager交通管理器详解

CARLA Traffic Manager 一、什么是Traffic Manager1、Traffic Manager简介2、Traffic Manager框架3、Traffic Manager模块 二、Traffic Manager控制方法1、TM控制交通参与者的自动驾驶的规则2、TM控制交通参与者行为的API摘要3、TM控制交通参与者行为的API 三、Traffic Manager…

[carla入门教程]-5 使用ROS与carla通信

本专栏教程将记录从安装carla到调用carla的pythonAPI进行车辆操控并采集数据的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制. 第五节 使用ros与carla通信 本小节的主要内容是介绍carla中的如何使用ros进行通信. 章节内容介…

CARLA安装记录(二)

安装好显卡驱动后&#xff0c;接下来的步骤是安装Unreal Engine。我的操作系统是Ubuntu 18.04 系统要求 Ubuntu 18.04。CARLA兼容Ubuntu 16.04及之前版本&#xff0c;但虚幻引擎正常工作需要合适的编译器。至少130GB磁盘空间。CARLA会占用大约31GB的空间&#xff0c;而虚幻引…

Carla安装记录

Carla安装记录 最近打算在做一些自动驾驶相关的东西&#xff0c;所以安装了一下Carla。在这里记录一些自己的安装过程中遇到的一些问题和解决的方法。 Carla release版本下载 想要安装Carla&#xff0c;可以选择release版本或者源码安装。在这里我主要介绍release版本的安装…

Carla中实现车辆轨迹获得

Carla中实现车辆循迹及车道保持&#xff08;使用MPC和强化学习&#xff09; 需要用到的 python apicarla.mapmethods一个简单的方法实现路径规划 carla.Waypointmethods carla.DebugHelpercarla.World 强化学习部分方法自动驾驶综述实验结果 模仿学习&#xff08;Imitation Lea…

Carla学习(五) Carla常用传感器

Depth camera,输出carla.Image&#xff0c;深度相机使用三通道RGB值存储距离信息&#xff0c;然后将其转换为距离灰度图&#xff1a; normalized (R G * 256 B * 256 * 256) / (256 * 256 * 256 - 1) in_meters 1000 * normalized传感器数据包含&#xff1a; frame&#…