请分享一些关于java中rehash方法的见解?

请分享一些关于java中rehash方法的见解?,java,api,hash,hashtable,Java,Api,Hash,Hashtable,我正在寻找一些关于哈希表/哈希映射数据结构的更好的见解 通过查看api,我可以看出内部条目类被称为bucket。如果我错了,请纠正我 请找到以下方法:- public synchronized V put(K key, V value) { // Make sure the value is not null if (value == null) { throw new NullPointerException(); } // Makes s

我正在寻找一些关于哈希表/哈希映射数据结构的更好的见解

通过查看api,我可以看出内部条目类被称为bucket。如果我错了,请纠正我

请找到以下方法:-

  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;
}
public synchronized V put(K键,V值){
//确保该值不为null
如果(值==null){
抛出新的NullPointerException();
}
//确保该键不在哈希表中。
条目选项卡[]=表格;
int hash=散列(键);
int index=(hash&0x7FFFFFFF)%tab.length;
for(条目e=tab[index];e!=null;e=e.next){
if((e.hash==hash)和&e.key.equals(key)){
V old=e.value;
e、 价值=价值;
返老还童;
}
}
modCount++;
如果(计数>=阈值){
//如果超过阈值,则重新刷新表
复述();
tab=表格;
散列=散列(键);
索引=(散列&0x7FFFFFFF)%tab.length;
}
//创建新条目。
条目e=tab[index];
Entry
是一个实例,可以表示链接列表中的链接。请注意,
next
成员指的是列表中的下一个条目

bucket包含映射到同一索引的条目的链接列表

Entry e=tab[index]
仅当该索引中尚未存储任何条目时才会返回null。否则,它将返回该bucket的链接列表中的第一个条目


tab[index]=新条目(散列、键、值、e);
创建一个新条目并将其作为bucket中的第一个条目存储。前一个条目传递给条目构造函数,以便成为列表中的下一个(第二个)条目。

您是如何决定
tab[index]
总是空的?它清楚地表明它正在分配
选项卡[索引]
。如果他们想分配空的,他们会分配空的。我们在这个方法中计算索引,我们也在检查索引中是否存在键/值对。如果在这种情况下,索引中没有任何内容,我认为是选项卡[索引]将为空。如果我错了,请纠正我。我还有一个问题,你可能觉得我是新手。内部类条目中的索引是否可以有多个不同的键。@Ankit我不确定我是否理解你的问题。条目实例有一个键和一个值。你说的“内部类条目中的索引”是什么意思?我将尝试解释我的困惑。请耐心听我说。我的意思是说我们正在计算索引,基于api正在遍历内部条目对象;因此我很好奇,找到的索引的条目对象是否可以包含对其他可能具有不同键的条目的引用。@Ankit是的,当然。每个键最多出现一次因此,两个条目将有两个不同的键。不同的键可能映射到地图的同一个bucket,在这种情况下,它们各自的条目将属于同一个链表。
Entry<K,V> e = tab[index];
Entry<K,V> e = null 
 instead  of 
Entry<K,V> e = tab[index];