hashmap 通过 hash 函数计算 key 得到存储地址?
但是没看到什么资料来解释这个存储地址是个什么东西,为什么有了这个 hash 结果就可以直接定位到具体的内存存储地址?
1
hhw123 2019-07-24 12:25:59 +08:00 via iPhone
看看数据结构
|
2
Weixiao0725 2019-07-24 12:34:37 +08:00
这还要依赖具体的 HashMap 的存储结构,以 Java 中的链地址法为例,计算完 hash 值以后还要做一次模运算确定元素所在的 slot 位置,即 `index=hash%Entry[].length`,这个 index 才是你说的跟地址相关的。
|
3
zado 2019-07-24 12:34:56 +08:00
具体地址 = 起始地址 + ( hash * 单位大小);
|
4
VDimos 2019-07-24 12:36:40 +08:00 via Android
key 可以计算出 offset 的,根据这个 offset 去获取就行了
|
5
lastpass 2019-07-24 12:37:32 +08:00 via Android
java 本身隐藏了指针。这个东西是模拟的指针。并不是真正的内存地址。
|
6
lihongjie0209 2019-07-24 12:39:27 +08:00
在 java 中没有内存地址的说法.
hash 底层的实现要不是数组, 要不是树. hash 最后得到的一定是一个数组中的元素或者是树的节点, 是一个对象 |
7
ic2y 2019-07-24 13:15:33 +08:00 1
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,是一个跟线程有关的生成算法。 |
8
dartabe 2019-07-24 13:54:26 +08:00
教科书上讲的多是模运算 不过实际应用上应该是映射到相同的地址少的算法都可以吧
|
9
dartabe 2019-07-24 13:55:45 +08:00
其实就一道 leetcode easy 的题
|
10
reus 2019-07-24 13:56:41 +08:00
所有数据结构书都会讲到,为什么不看?
|