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

时间:2013-09-09 11:09:59

标签: java collections hashmap

我正在尝试了解linkedhashmap的内部工作。

所以当我们调用linkedhashmap的put(map,key)时。在内部,它会调用[createEntry][1]

 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    }

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

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

有人可以解释这段代码。

2 个答案:

答案 0 :(得分:2)

  

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

以这种方式实现起来更简单。 HashMap也是如此。这是碰撞链表,而不是迭代器使用的列表。

  

应将其添加到linkedhashmap的末尾。

它在哪里说?

答案 1 :(得分:1)

首先了解HashMap put()方法的工作原理:

使用put方法将键值对添加到地图中

public V put(K var1, V var2) {  
    return this.putVal(hash(var1), var1, var2, false, true);  
}

在这里,我们传递密钥-K var1 和值– V var2

put()方法在内部调用putVal()方法,而putVal()采用以下参数。

  • hash(var1)-密钥的hashCode
  • var1 –键
  • var2 –值
  • 布尔假值
  • 布尔真实值

putVal()首先检查HashMap表,如果该表为null或为空,则调用resize()方法。然后resize()方法为HashMap创建一个新表。

Resize()方法调用–最初,该表为null。因此,第一次使用默认大小创建新表。如果在阈值字段中使用HashMap(int initialCapacity)HashMap(int initialCapacity, float loadFactor)构造函数设置了初始容量,则根据阈值设置初始容量。

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

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16  

如果定义了初始容量:

int oldThr = threshold; //Threshold is being set in oldThr local field  

然后根据以下条件,如果阈值大于0,则将其设置为newCap(new capacity for the table)

else if (oldThr > 0) // initial capacity was placed in threshold  
    newCap = oldThr;

否则使用默认值:

newCap = DEFAULT_INITIAL_CAPACITY;  
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);  

使用新容量创建新表:

Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];  

在其他情况下,它会检查MAXIMUM_CAPACITY,如果当前容量大于MAXIMUM_CAPACITY,那么它将调整表的大小。

返回putVal之后:

然后,如果索引值[(n - 1) & hash](表存储桶)为空,则调用newNode()方法,并将新创建的入口节点放置在HashMap表中的计算索引处。

if ((p = tab[i = (n - 1) & hash]) == null)  
    tab[i] = newNode(hash, key, value, null);  

然后检查哈希表中的哈希值索引(如果不存在),然后创建一个新节点,该节点包含该哈希表存储桶中的hashCode,Key,Value和下一个节点引用。最初它将为null,当将新节点添加到相同的哈希索引时,将形成LinkedList,因为具有相同哈希码索引的新节点将使用链表以链接列表的方式附加到先前添加的节点旁边。下一个领域参考。

要了解有关HashMap的更多信息,请进行以下操作: http://techmastertutorial.in/java-collection-internal-hashmap.html

LinkedHashMap put()方法:

添加键值对与HashMap相同,在使用LinkedHash映射的情况下,我们将借助之前和之后的引用保留更多详细信息。 由于我们为每个键值对都添加了一个条目,因此在添加条目时,还要同时更新之前和之后的引用。双向链接列表由之前和之后的引用组成。使用前后指针,我们可以按插入顺序遍历条目。

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

LinkedHashMap内部工作: http://techmastertutorial.in/java-collection-internal-linked-hashmap.html