gpt4 book ai didi

java - 为什么 HashMap 和 Hashtable 的 put 方法有区别?

转载 作者:搜寻专家 更新时间:2023-11-01 03:52:55 26 4
gpt4 key购买 nike

我想知道 HashMapHashtableput 方法的区别

HashTable放方法代码

Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
V old = e.value;
e.value = value;
return old;
}
}

HashMap放方法代码

int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}

为什么哈希表有不同的代码来查找索引?

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

而hashMap有jdk设计者提供的hash()函数。

最佳答案

0x7FFFFFFF 的二进制是什么?它是 01111111111111111111111111111111

注意最左边的0。这意味着该数字始终为正数(因为最左边的 为零)。由于 &,每个用此二进制文件进行 & 运算的数字都将非负,因为:

01111111111111111111111111111111
Anything &
--------------------------------
0 ← Always

在此之后,% 运算符用于确保我们在tab.length 范围内。

您没有发布HashMap 如何生成索引的实现。我不认为这有什么不同。毕竟他们的逻辑非常相似。

HashMap 调用 indexFor 正在做:return h & (length-1);

重要说明:HashTableHashMap 更早,难怪会有不同的实现。

关于java - 为什么 HashMap 和 Hashtable 的 put 方法有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20236074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com