hashmap 中哈希函数计算出来的结果是个什么东西?怎么用来定位内存地址的?

2019-07-24 12:21:14 +08:00
 rizon

hashmap 通过 hash 函数计算 key 得到存储地址?
但是没看到什么资料来解释这个存储地址是个什么东西,为什么有了这个 hash 结果就可以直接定位到具体的内存存储地址?

2554 次点击
所在节点    程序员
10 条回复
hhw123
2019-07-24 12:25:59 +08:00
看看数据结构
Weixiao0725
2019-07-24 12:34:37 +08:00
这还要依赖具体的 HashMap 的存储结构,以 Java 中的链地址法为例,计算完 hash 值以后还要做一次模运算确定元素所在的 slot 位置,即 `index=hash%Entry[].length`,这个 index 才是你说的跟地址相关的。
zado
2019-07-24 12:34:56 +08:00
具体地址 = 起始地址 + ( hash * 单位大小);
VDimos
2019-07-24 12:36:40 +08:00
key 可以计算出 offset 的,根据这个 offset 去获取就行了
lastpass
2019-07-24 12:37:32 +08:00
java 本身隐藏了指针。这个东西是模拟的指针。并不是真正的内存地址。
lihongjie0209
2019-07-24 12:39:27 +08:00
在 java 中没有内存地址的说法.

hash 底层的实现要不是数组, 要不是树.

hash 最后得到的一定是一个数组中的元素或者是树的节点, 是一个对象
ic2y
2019-07-24 13:15:33 +08:00
hashcode 是在 JVM 里实现的

这个值,可以通过配置参数,改变行为 (-XX:hashCode=1)
0. A randomly generated number.
1. A function of memory address of the object.
2. A hardcoded 1 (used for sensitivity testing.)
3. A sequence.
4. The memory address of the object, cast to int.
5. Thread state combined with xorshift ( https://en.wikipedia.org/wiki/Xorshift)

JDK6 和 7 默认使用 0,一个随机数算法 http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/os.cpp#l814。
JDK8 开始默认使用 5,是一个跟线程有关的生成算法。
dartabe
2019-07-24 13:54:26 +08:00
教科书上讲的多是模运算 不过实际应用上应该是映射到相同的地址少的算法都可以吧
dartabe
2019-07-24 13:55:45 +08:00
其实就一道 leetcode easy 的题
reus
2019-07-24 13:56:41 +08:00
所有数据结构书都会讲到,为什么不看?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585732

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX