jsonobject put相同key_开发多年HashMap不知道?Java原理分析put、get、resize一招搞定...

本文详细介绍了HashMap的内部工作原理,包括put方法如何处理哈希冲突、get方法的查找逻辑以及HashMap的扩容机制。通过对源码的分析,解释了在扩容时如何通过特殊计算方式重排链表,确保数据正确映射到新的索引位置。
摘要由CSDN通过智能技术生成

206ce648d2405db26e93d41d95850e59.png

前言

在分析HashMap之前,先看下图,理解一下HashMap的结构

b0235517d96863dfccaed64a48ea7ad2.png

我手画了一个图,简单描述一下HashMap的结构,数组+链表构成一个HashMap,当我们调用put方法的时候增加一个新的 key-value 的时候,HashMap会通过key的hash值和当前node数据的长度计算出来一个index值,然后在把 hash,key,value 创建一个Node对象,根据index存入Node[]数组中,当计算出来的index上已经存在了Node对象的话。就把新值存在 Node[index].next 上,就像图中的 a->aa->a1 一样,这样的情况我们称之为hash冲突

HashMap基本用法

Map<String, Object> map = new HashMap<>();
map.put("student", "333");//正常入数组,i=5
map.put("goods", "222");//正常入数据,i=9
map.put("product", "222");//正常入数据,i=2
map.put("hello", "222");//正常入数据,i=11
map.put("what", "222");//正常入数据,i=3
map.put("fuck", "222");//正常入数据,i=7
map.put("a", "222");//正常入数据,i=1
map.put("b", "222");//哈希冲突,i=2,product.next
map.put("c", "222");//哈希冲突,i=3,what.next
map.put("d", "222");//正常入数据,i=4
map.put("e", "222");//哈希冲突,i=5,student.next
map.put("f", "222");//正常入数据,i=6
map.put("g", "222");//哈希冲突,i=7,fuck.next

首先我们都是创建一个Map对象,然后用HashMap来实现,通过调用 put get 方法就可以实现数据存储,我们就先从构造方法开始分析

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}

初始化负载因子为0.75,负载因子的作用是计算一个扩容阀值,当容器内数量达到阀值时,HashMap会进行一次resize,把容器大小扩大一倍,同时也会重新计算扩容阀值。扩容阀值=容器数量 * 负载因子,具体为啥是0.75别问我,自己查资料吧(其实我是不知道,我觉得这个不重要吧~)

继续看 put 方法

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

额,也没啥可看的,继续往下看putVal方法吧

transient Node<K,V>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值