Java 当一个重复的键添加了不同的“tab.length”时,HashMap怎么能保证相同的索引?

Java 当一个重复的键添加了不同的“tab.length”时,HashMap怎么能保证相同的索引?,java,android,Java,Android,下面的代码用于将元素添加到HashMap(来自Android 5.1.1源代码树),我对这句话感到非常困惑:int index=hash&(tab.length-1),当一个重复的键添加了不同的tab.length时,该映射如何保证相同的索引 例如,假设我们有一个新的空HashMap hMap。首先,我们向它添加一对(“1”,“1”),假设此时tab.length等于1,然后我们向这个映射添加许多对,假设tab.length等于“x”,现在我们向它添加一对重复的对(“1”,“1”),注意tab.

下面的代码用于将元素添加到HashMap(来自Android 5.1.1源代码树),我对这句话感到非常困惑:
int index=hash&(tab.length-1)
,当一个重复的键添加了不同的
tab.length
时,该映射如何保证相同的索引

例如,假设我们有一个新的空HashMap hMap。首先,我们向它添加一对(“1”,“1”),假设此时
tab.length
等于1,然后我们向这个映射添加许多对,假设
tab.length
等于“x”,现在我们向它添加一对重复的对(“1”,“1”),注意
tab.length
已经更改,因此索引的值
int index=hash&(tab.length-1)也可能更改

 /**
 * Maps the specified key to the specified value.
 *
 * @param key
 *            the key.
 * @param value
 *            the value.
 * @return the value of any previous mapping with the specified key or
 *         {@code null} if there was no such mapping.
 */
@Override public V put(K key, V value) {
    if (key == null) {
        return putValueForNullKey(value);
    }

    int hash = Collections.secondaryHash(key);
    HashMapEntry<K, V>[] tab = table;
    int index = hash & (tab.length - 1);
    for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) {
        if (e.hash == hash && key.equals(e.key)) {
            preModify(e);
            V oldValue = e.value;
            e.value = value;
            return oldValue;
        }
    }

    // No entry for (non-null) key is present; create one
    modCount++;
    if (size++ > threshold) {
        tab = doubleCapacity();
        index = hash & (tab.length - 1);
    }
    addNewEntry(key, value, hash, index);
    return null;
}
/**
*将指定的键映射到指定的值。
*
*@param-key
*钥匙。
*@param值
*价值。
*@返回具有指定键或
*{@code null}如果没有这样的映射。
*/
@覆盖公共V put(K键,V值){
if(key==null){
返回putValueForNullKey(值);
}
int hash=Collections.secondaryHash(key);
HashMapEntry[]选项卡=表格;
int index=hash&(tab.length-1);
for(HashMapEntry e=tab[index];e!=null;e=e.next){
如果(e.hash==hash&&key.equals(e.key)){
预修改(e);
V oldValue=e.value;
e、 价值=价值;
返回旧值;
}
}
//不存在(非空)密钥的条目;请创建一个
modCount++;
如果(大小+++>阈值){
tab=doubleCapacity();
index=hash&(tab.length-1);
}
addNewEntry(键、值、哈希、索引);
返回null;
}

当表需要重建时,它将首先重新计算旧元素的索引,因此索引将跟随表长度的变化

当表需要重建时,它会首先重新计算旧元素的索引,因此索引将跟随表长度的变化

我认为你需要在维基百科或其他网站上查找“哈希表”,看看它们是如何工作的<代码>选项卡。长度
不是您添加的元素数。它是在创建哈希表时分配的固定长度的表。添加或删除元素时,表大小通常不会更改。(如果实现允许改变表的大小,以便更好地优化表,则表的大小是可能的;但随后必须从头开始重建整个表。)当表需要重建时,它将首先重新计算旧元素的索引,所以索引将跟随表长度的变化。我认为你需要在维基百科或其他地方查找“哈希表”,看看它们是如何工作的<代码>选项卡。长度不是您添加的元素数。它是在创建哈希表时分配的固定长度的表。添加或删除元素时,表大小通常不会更改。(如果实现允许改变表的大小,以便更好地优化表,那么表的大小是可能的;但随后必须从头开始重建整个表。)当表需要重建时,它将首先重新计算旧元素的索引,因此索引将跟随表长的变化。