put()如何在HashMap中工作

时间:2017-01-29 21:52:18

标签: java hashmap

我在互联网上读到,在碰撞的情况下,put()将元素插入到链表的“头部”。

例如:

地图位置1有1,0 - > 2,0 - > 3,0 - > 4,0 - >空

现在,我将向链表中插入一个元素5,0(我希望hash()返回元素5的位置1值)。插入后,位置1链接列表将是5,0 - > 1,0 - > 2,0 - > 3,0 - > 4,0 - >空

现在,我想更新3到30的值。因此我使用map.put(KEY = 3,VALUE = 30);

我的问题是put()如何知道是更新还是插入?

要知道元素是否存在于链表中,它必须扫描链表。根据我在互联网上看到的内容,如果发生冲突,put()会在链表的“头部”插入元素。

提前致谢

3 个答案:

答案 0 :(得分:0)

task = @task.first
# get all associated task products
task.task_products
# get store order
task.store_order
# iterate all tasks
@tasks.each do |task|
  #iterate all task_products
  task.task_products.each do |task_product|
  end
  #iterate store order
  task.store_order do |store_order|
  end
end

答案 1 :(得分:0)

  

我的问题是put()如何知道是更新还是插入?

必须在哈希表中获取与给定键相关联的存储桶,并迭代存储在那里的链表以尝试查找与键和提供的值匹配的元素。如果找到这样的元素,它将使用新值更新,否则将在链接列表的头部添加一个新元素。

为了保持此操作的有效性(摊销的常量时间),每个元素的链表应尽可能短。这可以通过以下方式完成:

  1. 哈希函数应该在所有存储桶之间平均分配元素。
  2. 哈希映射容量应该增加,并在添加新元素时添加更多桶。

答案 2 :(得分:0)

如果发生碰撞,如果已经有一个对象位于计算索引上,则会检查其下一个属性。如果为null,则当前Entry对象成为LinkedList中的下一个节点。如果next变量不为null,则执行procedure直到next被计算为null。

您可以从以下视频中了解详情:“分钟3:26:

https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ozYZh/core-collisions-in-hash-tables

但是如果你需要在1.地方添加项目,你可以使用以下答案:

https://stackoverflow.com/a/27214791