【问题标题】:HashMap different bucket index for a key possible?HashMap 不同的桶索引为一个键可能吗?
【发布时间】:2014-09-24 19:47:01
【问题描述】:

我关心的是检查 Java HashMap 如何为键获取相同的索引。即使它的大小从默认的 16 扩展到更高的值,因为我们不断添加条目。

我尝试复现HashMap的索引算法。

int length=1<<5;
int v=6546546;
int h = new Integer(v).hashCode();
h =h^( (h >>> 20) ^ (h >>> 12));
h=h ^ h >>> 7 ^ h >>> 4;
System.out.println("index :: " + (h & (length-1)));

我针对不同的“长度”值运行了我的代码。 因此,对于相同的键,我得到不同的索引,因为 HashMap 的长度发生了变化。我在这里想念什么?

我的结果:

length=1<<5;
index :: 10

length=1<<15; 

index :: 7082

length=1<<30;  
index :: 6626218

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    您错过了这样一个事实,即每次长度更改时,条目都会重新分配 - 它们被适当地放入新的存储桶中。这就是地图扩展需要一点时间 (O(N)) 的原因——所有内容都需要从旧存储桶复制到新存储桶。

    只要您一次只有一个长度的索引(而不是混合索引),就可以了。

    【讨论】:

    • 谢谢乔恩!我有点忽略了 transfer() 函数。假设它只是创建一个新数组并复制条目。您节省了我的一些时间:D 不能投票,因为我是 Stackoverflow 的新手并且还没有足够的积分。很抱歉:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2020-01-01
    • 2012-12-02
    相关资源
    最近更新 更多