简述HashMap的put过程

本文详细探讨了JDK8中HashMap的put过程,包括其使用的hash函数和putVal方法实现。当插入key-value对时,HashMap利用key的hashCode()计算存储位置。如果位置为空则直接插入,否则根据是否为红黑树进行处理。如果链表长度大于等于8,会转换为红黑树以优化性能。
摘要由CSDN通过智能技术生成

HashMap的put方法

JDK7中HashMap采用的是位桶+链表的方式,即我们常说的散列链表的方式,而JDK8中采用的是位桶+链表/红黑树,本文研究的是 JDK8中的put方法。
在这里插入图片描述
JDK1.8 put方法源码:

public V put(K key, V value) {
   
    return putVal(hash(key), key, value, false, true);
}

这里我们先关注下hash函数,在HashMap中其实现如下:

static final int hash(Object key) {
   
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

这里用到的方法很简单,就是把key与其高16位异或。文档中有如下说明:
There is a tradeoff between speed, utility, and quality of bit-spreading.
因为没有完美的哈希算法可以彻底避免碰撞,所以只能尽可能减少碰撞,在各方面权衡之后得到一个折中方案,这里我们就不再追究了。
put方法的具体实现在putVal中,我们看下其实现:

// 参数onlyIfAbsent表示是否替换原值
// 参数evict我们可以忽略它,它主要用来区别通过put添加还是创建时初始化数据的
final V putVal(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值