【问题标题】:How does put() work in HashMapput() 在 HashMap 中是如何工作的
【发布时间】:2017-01-29 21:52:17
【问题描述】:

我在互联网上读到 put() 在发生冲突时会在链表的“头部”插入元素。

例如:

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

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

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

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

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

提前致谢

【问题讨论】:

  • 你的代码在哪里?
  • map.put(3, 30);
  • 答案是:“所有键都必须是唯一的”。如果地图被命令添加一个已经存在的键,它只是替换该值。请参阅我的代码示例。
  • Whatsmore,看起来你可能混淆了 LinkedList,它既是一个 List 又是一个双端队列,以及 HashMap。因为 LinkedList API 没有 put() 方法。它只有 add()、offer() 和 push(),具体取决于您要使用的模式...

标签: java hashmap


【解决方案1】:
import java.util.HashMap;

public class Test {

    public static void main(String[] args) {

        HashMap<Integer, String> map = new HashMap<>();

        map.put(1, "Value 1");
        map.put(2, "Value 2");
        map.put(3, "Value 3");
        map.put(4, "Value 4");
        map.put(5, "Value 5");

        System.out.println(map);

        // existing key but new value
        map.put(2, "Value 7");

        System.out.println(map);

    }
}

【讨论】:

    【解决方案2】:

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

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

    为了保持这个操作的效率(摊销常数时间),每个元素的链表应该尽可能短。这是由以下人员完成的:

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

    【讨论】:

      【解决方案3】:

      如果发生碰撞,如果已经有一个对象坐在计算的索引上,则检查其下一个属性。如果为null,则当前Entry 对象成为LinkedList 中的下一个节点。如果下一个变量不为空,则继续执行过程,直到下一个被评估为空。

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

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

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

      https://stackoverflow.com/a/27214791

      【讨论】:

        猜你喜欢
        • 2016-04-30
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        相关资源
        最近更新 更多