学习
实践
活动
专区
工具
TVP
写文章
专栏首页CWIKIUSJava HashMap 在获得 Key 的 Hash 值的时候用的是什么算法

Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法

Java 在 HashMap Key 的 Hash 值的时候用的的是自己 Object 中的 hashCode() 算法。

返回的结果是一个整数值。

如果你查看 JDK 的源代码的话,在 HashMap 类中会有下面的这个方法。

        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }

通过这个方法,我们可以看到返回的值是整数。

JDK hashCode

如果我们继续跟踪代码,我们会看到在最最基础的 Object 对象中。

有下面的代码:

public int hashCode() {
	return J9VMInternals.fastIdentityHashCode(this);
}

是不是很奇怪,为什么这个类的名字为:J9VMInternals

这是因为我们的机器装的是 IBM 的 OpenJ9 虚拟机的版本。

IBM 在这里定义了自己的获得 hashCode 的方法。

	static int fastIdentityHashCode(Object anObject) {
		com.ibm.jit.JITHelpers h = jitHelpers;
		if (null == h) {
			return identityHashCode(anObject); /* use early returns to make the JIT code faster */
		}
		if (h.is32Bit()) {
			int ptr = h.getIntFromObject(anObject, 0L);
			if ((ptr & com.ibm.oti.vm.VM.OBJECT_HEADER_HAS_BEEN_MOVED_IN_CLASS) != 0) {
				if (!h.isArray(anObject)) {
					int j9class = ptr & com.ibm.oti.vm.VM.J9_JAVA_CLASS_MASK;
					return h.getIntFromObject(anObject, h.getBackfillOffsetFromJ9Class32(j9class));
				}
			}
		} else {
			long ptr = (com.ibm.oti.vm.VM.FJ9OBJECT_SIZE == 4) ? Integer.toUnsignedLong(h.getIntFromObject(anObject, 0L)) : h.getLongFromObject(anObject, 0L);
			if ((ptr & com.ibm.oti.vm.VM.OBJECT_HEADER_HAS_BEEN_MOVED_IN_CLASS) != 0) {
				if (!h.isArray(anObject)) {
					long j9class = ptr & com.ibm.oti.vm.VM.J9_JAVA_CLASS_MASK;
					return h.getIntFromObject(anObject, h.getBackfillOffsetFromJ9Class64(j9class));
				}
			}
		}
		return identityHashCode(anObject);
	}

这个 hashCode 的方法被 IBM 提高了下,主要是看看输入的对象是不是 32 位的,如果是 32 位的,会用到 IBM 自己的方法。

否则还是使用传统的 hashCode 方法。

当然,对程序员来说,这部分的内容是透明的,程序员通常只需要知道 JDK 会在你对对象获得 hashCode 的时候返回一个整数值。

在 HashMap 插入数据的时候需要计算 Hash 值,这个方法也会被用到。

可以说这个方法是 JDK 的基础的基础了。

https://www.ossez.com/t/java-hashmap-key-hash/14227

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://my.oschina.net/u/2344080复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法

    Java 在 HashMap Key 的 Hash 值的时候用的的是自己 Object 中的 hashCode() 算法。

    HoneyMoose
  • 一文读懂JDK7,8,JD9的hashmap,hashtable,concurrenthashmap及他们的区别

    图中,紫色部分即代表哈希表,也称为哈希数组(默认数组大小是16,每对key-value键值对其实是存在map的内部类entry里的),数组的每个元素...

    java进阶架构师
  • 图解HashMap(一)

    HashMap是日常开发中经常会用到的一种数据结构,在介绍HashMap的时候会涉及到很多术语,比如时间复杂度O、散列(也叫哈希)、散列算法等,这些在大学课程里...

    陈宇明
  • 让我再撸一次HashMap

    由于近期忙着搬家,又偷懒了几个礼拜! 其实我很早以前就想写一篇关于HashMap的面试专题。对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你...

    Java识堂
  • HashMap 底层源码解读(一行一行读,有基础就能看懂)

    哈希冲突主要因为 哈希表底层的数组容量是小于实际存储的关键字的数量,所以发生冲突是必然的,我们只能够尽量避免,不能完全消除。

    RAIN7
  • ServerFrame::HashMap VS stl::unordered_map-性能探究之旅

    突然就对项目中的 HashMap 有了强烈的好奇心,这个 HashMap 的实现够高效吗,和 std::unordered_map 的效率比较性能如何? 他们的...

    serena
  • Java集合容器面试题(2020最新版)

    Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java...

    Java架构师必看
  • HashMap面试必问的6个点,你知道几个?

    针对这个问题,嗯,当然是必须看过HashMap源码。至于原理,下面那张图很清楚了:

    程序员追风
  • 剑指offer Java_工程图学基础知识点总结

    hashmap是基于hash算法的key-value键值对,通过key可以快速的找到value值,解决了数组的增加和删除以及链表的查询效率低的问题。

    全栈程序员站长
  • Java 8系列之重新认识HashMap

    作者:美团点评技术团队 链接:https://zhuanlan.zhihu.com/p/21673805 来源:知乎 著作权归作者所有。商业转载请联系作者...

    bear_fish
  • Java 基础概念·Java HashMap

    HashMap 是 Java 使用频率最高的用于映射(键值对)处理的数据类型。JDK1.8 对 HashMap 底层的实现进行了优化,例如引入红黑树的数据结构和...

    数媒派
  • 大厂面试HashMap,很多人栽在了这儿

    Hashmap是Java中最常用的集合类型,使用非常广泛。不过,有些细节问题很多人没有关注过,这也使很多人在面试时栽了跟头!比如,阿里很多团队为了考察候选人的基...

    用户7927337
  • Java8系列之重新认识HashMap

    摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8...

    美团技术团队
  • HashMap知识总结

    HashMap 是我们非常常用的数据结构,由数组和链表组合构成的数据结构。数组里每个地方都存了Key-Value这样的实例,在Java7叫Entry,在Java...

    故里
  • 面霸篇:Java 核心集合容器全解(核心卷二)

    码哥在 《Redis 系列》的开篇 Redis 为什么这么快中说过:学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系...

    码哥字节
  • 基于JDK8的HashMap详解

    HashMap是程序员使用频率较高的一种用于映射(键值对)处理的数据类型,随着JDK(Java Development Kit)版本的更新,HashMap也在不...

    Java阿呆
  • 基于JDK8的HashMap实现(万字详解)

    这篇文章我们来聊一聊JDK1.8中,HashMap的具体实现。并结合JDK1.7,来看看HashMap有哪些改进。

    Java阿呆
  • HashMap实现原理解析

    HashMap底层就是一个数组结构,数组的每一项又是一个链表,当新建一个HashMap 的时候,就会初始化一个数组。

    Petterp
  • HashMap常见面试题_java面试题大汇总

    6.HashMap的table的容量如何确定?loadFactor是什么?该容量如何变化?这种变化会带来什么问题?

    全栈程序员站长

扫码关注腾讯云开发者

领取腾讯云代金券