Java put()在HashMap中是如何工作的

Java put()在HashMap中是如何工作的,java,hashmap,Java,Hashmap,我在互联网上读到,put()在linkedlist的“head”插入元素,以防发生冲突 例如: 地图位置1有1,0->2,0->3,0->4,0->null 现在,我将在linkedlist中插入一个元素5,0(我希望hash()返回元素5的位置1值)。插入后,位置1 linkedlist将为5,0->1,0->2,0->3,0->4,0->null 现在,我想将值3更新为30。因此我使用map.put(KEY=3,VALUE=30) 我的问题是put()如何知道是更新还是插入 要知道该元素是否

我在互联网上读到,put()在linkedlist的“head”插入元素,以防发生冲突

例如:

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

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

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

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

要知道该元素是否存在于linkedlist中,它必须扫描linkedlist。根据我在internet上读到的内容,如果发生冲突,put()会在linkedlist的“head”处插入元素

提前感谢

导入java.util.HashMap;
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);

    }
}
公开课考试{ 公共静态void main(字符串[]args){ HashMap=newHashMap(); 地图放置(1,“值1”); 地图放置(2,“值2”); 地图放置(3,“值3”); 地图放置(4,“值4”); 地图放置(5,“值5”); 系统输出打印项次(map); //现有关键但新的价值 地图放置(2,“值7”); 系统输出打印项次(map); } }
我的问题是put()如何知道是更新还是插入

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

为了保持此操作的效率(摊销固定时间),每个元素的链表应尽可能短。这是通过以下方式实现的:

  • 散列函数应该在所有bucket中平均分配元素
  • 随着新元素的添加,散列映射容量应该会增加并添加更多的存储桶

  • 在发生冲突的情况下,如果已经有一个对象位于计算索引上,则会检查其下一个属性。若为空,则当前条目对象将成为LinkedList中的下一个节点。若下一个变量不为null,则遵循该过程,直到下一个变量的计算结果为null

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

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


    你的密码在哪里?
    map.put(3,30);
    答案是:“所有的钥匙都必须是唯一的。如果该映射被命令添加一个已经存在的键,它只会替换该值。请看我的代码示例。此外,您可能混淆了LinkedList(既是列表又是双端队列)和HashMap。因为LinkedList API没有put()-方法。它只有add()、offer()和push(),具体取决于您希望使用它的模式。。。