Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hashmap的内部结构_Java_Hashmap - Fatal编程技术网

Java Hashmap的内部结构

Java Hashmap的内部结构,java,hashmap,Java,Hashmap,我在浏览HashMap的内部结构时,陷入了bucket如何存储多个对象的概念 由于HashMap是Entry对象的数组,所以数组的每个索引都是一个bucket。条目类如下 static class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> next_entry; int hash; } 静态类条目实现Map.E

我在浏览HashMap的内部结构时,陷入了bucket如何存储多个对象的概念

由于
HashMap
Entry
对象的数组,所以数组的每个索引都是一个bucket。
条目
类如下

static class Entry<K,V> implements Map.Entry<K,V> {  
    K key;  
    V  value;  
    Entry<K,V> next_entry;  
    int hash;  
}   
静态类条目实现Map.Entry{
K键;
V值;
输入下一个输入;
整数散列;
}   
关于添加新的键值对

  • 如果我们正在添加一个带有已保存在HashMap中的键的值,那么该值将被覆盖
  • 否则,该元素将添加到铲斗中。如果bucket已经至少有一个元素,则会添加一个新元素并将其放置在bucket中的第一个位置。它的下一个字段是指旧元素

那么,一个bucket如何按照第二点存储多个对象呢?

Java(而不是
Java.util.LinkedList
)。如果类将
hashCode()
方法硬编码为单个值;加载到
HashMap
结构中的此类实例将退化为
linkedlist
。您可以重写
equals()
以支持“bucket”中的replace。

这是关于Oracle JDK 1.7.0.55中的HashMap

通过以下方式创建新条目:

void createEntry(int hash, K key, V value, int bucketIndex) {
    Entry<K,V> e = table[bucketIndex];
    table[bucketIndex] = new Entry<>(hash, key, value, e);
    size++;
}

因此,单链表的
条目
元素都具有具有相同散列的键。但是根据hashCode的约定,彼此不相等的对象可以具有相同的hash码。因此,在上述for循环中使用
key.equals(k)
并不是在任何情况下都适用于循环的第一轮。因此循环可以一直遍历到链表的末尾。

HashMap维护一个数组:Entry[];该数组的每个元素表示一个“bucket”。bucket中的其余条目是通过遍历by Entry中维护的链表来访问的。接下来。

这不是这些对象的数组。混淆在哪里?第二点的哪一部分不允许在一个bucket中存储多个对象?Java的
HashMap
implementation@injecteer有,
HashMap
由一个
条目[]
支持,该条目的每个元素都是一个bucket。您可以阅读有关哈希表实现的内容,例如。这几乎是一样的。我会说“链表”,而不是“
LinkedList
”,以避免与
java.util.LinkedList
混淆。Oracle JDK 8使它更有趣-条目可以形成链表或红黑树。。。
final Entry<K,V> getEntry(Object key) {
    if (size == 0) {
        return null;
    }

    int hash = (key == null) ? 0 : hash(key);
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) { // <- see here
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}