HashMap剖析之put()和get()方法

本文深入分析了HashMap的put()和get()方法。首先,讲解了put()方法的工作流程,包括调用hash()计算哈希值,然后通过putVal()方法将键值对存入HashMap,处理哈希冲突。接着,分析了get()方法,它通过getNode()找到指定键的节点。文章还探讨了HashMap如何利用拉链法解决哈希冲突,并提供了方法执行过程的图解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文是基于Java 8HashMap进行分析,主要是分析HashMap中的put()get()方法。如果对HashMap的内部结构感兴趣可以看看我的相关博客。

下面将会分析这部分的源码,如果觉得源码分析内容太啰嗦,可以跳过源码部分,直接看源码下面的总结。

put()方法源码分析

HashMapput()方法是我们最常用的方法,但是put()方法是怎么工作的呢?

put()方法

    /**
     * HashMap的put()方法支持key/value为null
     */
    public V put(K key, V value) {
        //实际上是先调用HashMap的hash()方法获取到key的hash值
        //然后调用HashMap的putVal()方法
        return putVal(hash(key), key, value, false, true);
    }

put()方法实际上是

  1. 调用hash()方法获取到keyhash
  2. 调用putVal()方法存储key-value

核心方法是putVal()方法,下面我会先分析一下hash()方法,因为这个方法涉及到hash值这个关键属性的计算。

hash()方法

static final int hash(Object key) {
        int h;
        // key为null时,hash值为0
        // key不为null时,调用key对象的hashCode()方法并通过位运算异或和无符号右移将高位分散到低位
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }
  1. hash()方法指定了nullhash值为0。这样就可以支持keynull
  2. (h = key.hashCode()) ^ (h >>> 16)这段代码通过位运算异或和无符号右移将高位分散到低位,这样做可以减少哈希碰撞的概率(这块不是很清楚原理,是从方法注释上了解到的)

putVal()方法

    /**
     * Map.put()方法的实际实现
     *
     * @param hash key的hash值
     * @param key 键值对中的key
     * @param value 键值对中的v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值