Java Hashmap的内部结构
我在浏览HashMap的内部结构时,陷入了bucket如何存储多个对象的概念 由于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
是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;
}