首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

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

  •  
  •   rizon · 139 天前 · 1090 次点击
    这是一个创建于 139 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    10 回复  |  直到 2019-07-24 13:56:41 +08:00
        1
    hhw123   139 天前 via iPhone
    看看数据结构
        2
    Weixiao0725   139 天前
    这还要依赖具体的 HashMap 的存储结构,以 Java 中的链地址法为例,计算完 hash 值以后还要做一次模运算确定元素所在的 slot 位置,即 `index=hash%Entry[].length`,这个 index 才是你说的跟地址相关的。
        3
    zado   139 天前
    具体地址 = 起始地址 + ( hash * 单位大小);
        4
    VDimos   139 天前 via Android
    key 可以计算出 offset 的,根据这个 offset 去获取就行了
        5
    lastpass   139 天前 via Android
    java 本身隐藏了指针。这个东西是模拟的指针。并不是真正的内存地址。
        6
    lihongjie0209   139 天前
    在 java 中没有内存地址的说法.

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

    hash 最后得到的一定是一个数组中的元素或者是树的节点, 是一个对象
        7
    ic2y   139 天前   ♥ 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   139 天前
    教科书上讲的多是模运算 不过实际应用上应该是映射到相同的地址少的算法都可以吧
        9
    dartabe   139 天前
    其实就一道 leetcode easy 的题
        10
    reus   139 天前
    所有数据结构书都会讲到,为什么不看?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3160 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    ♥ Do have faith in what you're doing.