java map key 范围_java – HashMap如何确保使用key的hashcode计算的索引在可用范围内?...

我浏览了HashMap的源代码,并提出了一些问题. PUT方法采用Key和Value

>密钥哈希码的哈希函数.

>使用从上一步骤获得的哈希计算该对的桶位置

public V put(K key, V value) {

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

.....

}

static int hash(int h) {

h ^= (h >>> 20) ^ (h >>> 12);

return h ^ (h >>> 7) ^ (h >>> 4);

}

static int indexFor(int h, int length) {

return h & (length-1);

}

例:

>创建大小为10的HashMap.

>调用put(k,v)三次并假设这3个占用桶位7,8和9

>调用put第4 K,V对以及后续发生

>使用key.hashcode()调用hash()并计算哈希值

> indexFor基于哈希计算

题:

>如果计算出的第4个k,v的铲斗位置超出现有界限怎么办?说位置11?

提前致谢

AKH

解决方法:

对于你的第一个问题:地图总是使用2的幂来表示大小(如果你给它一个10的容量,它实际上会使用16),这意味着索引& (长度 – 1)将始终在[0,长度]范围内,因此它始终在范围内.

目前尚不清楚你的第二个和第三个问题是关于什么的.我不认为HashMap会重新分配所有内容,除非它需要.

标签:java,algorithm,hashmap,data-structures,hash

来源: https://codeday.me/bug/20190630/1331503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值