Java LinkedHashMap的put()方法在内部是如何工作的?

Java LinkedHashMap的put()方法在内部是如何工作的?,java,collections,hashmap,Java,Collections,Hashmap,我想了解linkedhashmap的内部工作原理 所以当我们调用putmap时,linkedhashmap的键。它在内部调用[createEntry][1] 在这里我无法理解旧变量的用法 为什么在标题之前添加新条目。它应该被添加到linkedhashmap的末尾 谁能解释一下这个密码吗 为什么在标题之前添加新条目 这样实现起来更简单。HashMap也是如此。这是冲突链表,而不是迭代器使用的链表 它应该被添加到linkedhashmap的末尾 它在哪里说的?首先了解HashMap put方法的工作

我想了解linkedhashmap的内部工作原理

所以当我们调用putmap时,linkedhashmap的键。它在内部调用[createEntry][1]

在这里我无法理解旧变量的用法

为什么在标题之前添加新条目。它应该被添加到linkedhashmap的末尾

谁能解释一下这个密码吗

为什么在标题之前添加新条目

这样实现起来更简单。HashMap也是如此。这是冲突链表,而不是迭代器使用的链表

它应该被添加到linkedhashmap的末尾

它在哪里说的?

首先了解HashMap put方法的工作原理: 使用put方法将键值对添加到映射: 公众诉putK var1,V var2{ 返回this.putValhashvar1,var1,var2,false,true; } 这里我们传递键-K var1和值-V var2

put方法在内部调用putVal方法,putVal采用以下参数

hashvar1-密钥的hashCode var1–键 var2–值 布尔假值 布尔真值 putVal首先检查HashMap表,如果该表为null或空,则调用resize方法。resize方法为HashMap创建一个新表

调整方法调用的大小–最初表为空。因此,这是第一次使用默认大小创建新表。如果使用HashMapint initialCapacity或HashMapint initialCapacity在阈值字段中设置初始容量,则会根据阈值设置初始容量

否则,它将选择表大小的默认初始容量。 HashMap的默认初始容量为16,使用下面的HashMap字段定义

静态最终int DEFAULT\u INITIAL\u CAPACITY=1 0//初始容量位于阈值中 newCap=oldThr; 否则使用默认值:

newCap=默认初始容量; newThr=默认负载系数*默认初始容量; 使用新容量创建新表:

节点[]新选项卡=节点[]新节点[newCap]; 在其他情况下,它会检查最大_容量,如果当前容量大于最大_容量,则会调整表的大小

返回putVal后:

然后,如果索引值[n-1&hash],table bucket为空,则调用newNode方法,并在HashMap表中的计算索引处放置一个新创建的条目节点

如果p=tab[i=n-1&hash]==null tab[i]=newNodehash,key,value,null; 然后检查哈希表中的哈希值索引,如果没有现有节点,则创建一个新节点,其中包含哈希表bucket中的哈希代码、键、值和下一个节点引用。最初它将为null,当一个新节点将被添加到相同的散列索引中时,将形成一个LinkedList,因为具有相同散列码索引的新节点将使用下一个字段引用以链表方式被追加到先前添加的节点的旁边

要了解有关HashMap的更多信息,请浏览:

LinkedHashMap放置方法: 添加一个键值对与HashMap相同,对于LinkedHash映射,我们在前后引用的帮助下保留了额外的细节。 因为我们为每个键值对添加了一个条目,所以在添加条目时,也会更新before和after引用。一个双链表由前后引用组成。使用前后指针,我们可以按插入顺序遍历条目

我们可以从头节点(添加到LinkedHashMap的第一个节点)开始,使用after指针进行遍历,直到after为null

LinkedHashMap内部工作:

您能解释一下在linkedhashmap中插入键值的情况吗?对于ex:1st,它使用密钥散列查找一个bucket。我无法理解下一步。哈希是从密钥派生的。如果还没有条目,则添加该条目。如果存在条目,则会在键上调用equalsObject。如果不匹配,则会在链表的开头添加一个新条目。该旧关键字在代码中的用途是什么。旧条目已被新条目改写。行:442。我知道了,所以旧条目的意思是,如果桶中已经有一个?然后添加新条目,它将指向旧条目?@Thinker Correct或null(如果未设置)。
 void createEntry(int hash, K key, V value, int bucketIndex) {
440        HashMap.Entry<K,V> old = table[bucketIndex];
441        Entry<K,V> e = new Entry<K,V>(hash, key, value, old);
442        table[bucketIndex] = e;
443        e.addBefore(header);
444        size++;
445    }