【问题标题】:Java String: Is hashcode actually the hashvalue?Java String:哈希码实际上是哈希值吗?
【发布时间】:2012-02-19 23:49:41
【问题描述】:

hastable 对要存储的对象使用一些哈希函数。

这个散列函数本质上是计算对象在表中的位置。

如果我们使用 HashTableHashMap 并且大小无法容纳更多元素,则这些集合将调整大小以容纳更多元素。
这意味着必须重新散列每个存储的元素以计算新更大表中的新位置。

我的问题如下(以上是正确的):
我读到String 通过使用它存储的字符来计算它的hashcode,此外hashvalue 被存储在内部(缓存)以获得最佳性能,因为它不必重新计算。

这是我没有得到的部分。如果hashcode 是基于String 存储的字符,那么hashtable 中的位置是如何计算的?

使用Stringhashcode 是否有一些额外的逻辑?所以Stringhashcode 实际上不是hashvalue

【问题讨论】:

    标签: java string hash hashmap hashtable


    【解决方案1】:

    哈希码没有改变。只有内部表中的位置是。打开HashMap看看:

    static int indexFor(int h, int length) {
        return h & (length-1);
    }
    

    表中的索引(实际上是数组)是根据散列和数组的大小确定的。

    因此,当“重新散列”发生时,它使用相同的哈希码,但长度不同,这意味着元素被放入不同的桶中。

    【讨论】:

    • 请注意,由于长度始终是 2 的幂,h & (length - 1) 等价于 h % length(这可能是很多学生在他们的数据结构课程中学习处理哈希桶的方式)。
    • @erickson:对不起。为什么这里的&% 一样?我没听懂。
    • (实际上% 会给出一半h 的错误答案。)@user384706 这只是有点小题大做。查看二进制中 2 减 1 的幂。
    • @user384706 除以 2 的幂与右移位相同。所以说length 是 256,或 2^8。将哈希码除以 256 相当于将哈希码右移 8 位;在此过程中移出的 8 个低位是除法运算的剩余部分。在这种情况下,用 255 (length - 1) 屏蔽(使用逻辑与)哈希码可以得到余数,而无需实际执行通用除法,这可能比按位“&”更昂贵。
    • 如果你真的想了解比特旋转,请获取 Hacker's Delight 的副本:amazon.com/Hackers-Delight-Henry-S-Warren/dp/0201914654
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2011-02-25
    • 2010-10-20
    • 1970-01-01
    • 2010-11-07
    • 2022-10-01
    相关资源
    最近更新 更多