我正在寻找关于哈希表/哈希映射数据结构的更好的见解。
通过api,我可以看出内部Entry类被引用为桶。如果我错了,请纠正我。
请找到以下方法: -
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the hashtable.
Entry tab[] = table;
int hash = hash(key);
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;
}
}
modCount++;
if (count >= threshold) {
// Rehash the table if the threshold is exceeded
rehash();
tab = table;
hash = hash(key);
index = (hash & 0x7FFFFFFF) % tab.length;
}
// Creates the new entry.
Entry<K,V> e = tab[index]; <-------are we assigining null to this entry?
tab[index] = new Entry<>(hash, key, value, e);
count++;
return null;
}
通过以下代码行
Entry<K,V> e = tab[index];
我可以假设我们正在为这个新的条目对象赋值null;请在这里纠正我。
所以我的另一个问题是: -
为什么我们不直接这样做
Entry<K,V> e = null
instead of
Entry<K,V> e = tab[index];
请在下面找到调试的屏幕截图: -
请分享您对此的宝贵见解。
答案 0 :(得分:2)
Entry<K,V>
是一个可以表示链接列表中的链接的实例。请注意,next
成员引用列表中的下一个条目。
存储桶包含映射到同一索引的条目的链接列表。
只有在该索引中尚未存储任何条目时, Entry<K,V> e = tab[index]
才会返回null。否则,它将返回该存储桶链接列表中的第一个条目。
tab[index] = new Entry<>(hash, key, value, e);
创建一个新条目并将其存储为存储桶中的第一个条目。前一个Entry被传递给Entry构造函数,以便成为列表中的下一个(第二个)条目。