求教,java高手请进

zgqallan 2004-05-13 04:45:55
我想知道HaspMap的put()方法是如何工作的,主要是将一组新的(key--value)放到合适的位置,以下是jdk的源码

public Object put(Object key, Object value) {
// Makes sure the key is not already in the HashMap.
Entry tab[] = table;
int hash = 0;
int index = 0;

if (key != null) {
hash = key.hashCode();
index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && key.equals(e.key)) {
Object old = e.value;
e.value = value;
return old;
}
}
} else {
for (Entry e = tab[0] ; e != null ; e = e.next) {
if (e.key == null) {
Object old = e.value;
e.value = value;
return old;
}
}
}

modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();

tab = table;
index = (hash & 0x7FFFFFFF) % tab.length;
}

请重点解释一下 index = (hash & 0x7FFFFFFF) % tab.length;
...全文
14 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
raimundo 2004-05-13
  • 打赏
  • 举报
回复
index = (hash & 0x7FFFFFFF) % tab.length
是具体应射算法,关键一步是% tab.length这是把hashCode具体影射到tab数组的位置,其实就是简单的除tab的长度取余
而hash & 0x7FFFFFFF就是把一个hashCode与
01111111111111111111111111111111
按位与,相当于取绝对值,取绝对值的目的是怕出负数

index = (hash & 0x7FFFFFFF) % tab.length

等于,相当于
| hash | % tab.length
raimundo 2004-05-13
  • 打赏
  • 举报
回复
赫赫,这是HashMap实现的散列算法,其实理解了hash就很容易了,hash算法要求存在里面的数据尽可能的分散,最好是1:1对应,这样就可以根据一个hash值为已确定一个对象了,可是实际上很难得做到完美的hashCode,随意必然会有重码,那么HashMap里的Entry就是表示key具有相同hashCode的对象组。index是根据key的hash计算出他在Entry[]中的位置,这就是%tab.length的意思

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧