Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法
创始人
2024-03-05 21:50:03
0

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 的基础的基础了。

Java HashMap 在获得 Key 的 Hash 值的时候用的是什么算法 - Java - OSSEZJava 在 HashMap Key 的 Hash 值的时候用的的是自己 Object 中的 hashCode() 算法。 返回的结果是一个整数值。 如果你查看 JDK 的源代码的话,在 HashMap 类中会有下面的这个方法。 public final int hashCode() { return Objects.hashCode(key) ^ Objects.hashCode(valu…https://www.ossez.com/t/java-hashmap-key-hash/14227

相关内容

热门资讯

漯河:公积金政策已做调整! 12月23日,漯河市住房公积金管理中心发布《关于住房公积金缴存基数调整工作的提醒》。我市住房公积金缴...
陕国投A:增发定价符合法规及国... 证券之星消息,陕国投A(000563)12月22日在投资者关系平台上答复投资者关心的问题。 投资者提...
公共利益保护实录:7个行政公益... 从农用地保护到抗战文物抢救,从处方药安全到妇女平等就业——行政公益诉讼如何以司法之力守护公共利益?2...
百亿富豪涉嫌犯罪!上海知名乐园... 12月22日晚,海昌海洋公园发布公告称,海昌海洋公园收到公司董事会主席、执行董事兼行政总裁俞发祥家属...
格陵兰岛总理:格陵兰岛领土完整... 当地时间12月23日,格陵兰岛自治政府总理尼尔森再次重申,格陵兰岛的领土完整和法律地位根植于国际法,...
被起诉的AI独角兽,这样回应好... AIX财经(AIXcaijing)原创 作者 | 陈丹 编辑 | 魏佳 AI与版权的战争,或许正迎来...
桃源法院:车祸背后的温情调解 ... “法官,我知道是我撞了人,可我刚毕业实在没能力赔这么多……”在桃源县人民法院的审判庭内,外卖员琚某的...
江西上高:高效调解有温度 倾力... 近年来,江西省宜春市上高县市场监督管理局始终以“维护消费合法权益,共筑满意消费环境”为目标,持续完善...
三部门发文完善幼儿园收费政策 12月23日,记者从国家发展改革委获悉,为更好促进学前教育普及普惠安全优质发展,有效降低人民群众保育...