【面试八股文 - java基础 - 数据结构 - HashMap】


前言

争做高产母猪ing。。。


一、Hash - 散列

祖传手法之“望文生义”,
散列,把集合里面的所有内容尽量平均的分散排列开,
那么怎么才能尽量平均呢,
一种比较古老的例子是:
把数字分为0到9的十组,
那么0到99就可以按照末位数字分到对应组内,
每组内的数字也就不连续了,
也就是将这100个数字分散开,
并排列成了10组数字。
那么同样的也就可以按照对3取余后的结果分成3组,
或者对其他数字取余分成任意组。


二、Map - 键值对

键值对就更好理解了,就是一个键和一个值凑成了一对嘛,
键可以简单理解为一个地址,那值就是里面这个地方住的人了,
集合里面有好多好多互不相干的键值对就是所谓的map了,
简单理解就是,我在map里放了两对(“北京”,“我可以弯腰”),(“南昌”,“我长不高了”)
那我去map里面找北京,就可以返回我可以弯腰,
我去map里面找南昌,就可以返回我长不高了


三、HashMap

1、数据结构

HashMap的数据结构是:数组+链表+红黑树
数组是用来存散列后的hash值的,
但是因为数组的长度有限,
所以不一样的内容可以hash值会一样,
也就是两个不同的键被分到了一组,
这时候就需要顺序往组里加内容,也就用到了链表,
但是,如果同一个组里数据太多了,
链表插入好插,但是查找的效率太慢了,
所以组里数据太多,链表就会转换成红黑树的结构。

ps1:
链表转红黑树的节点是8个,
红黑树转链表的节点是6个,防止两种结构反复横跳。
ps2:
红黑树作为数结构,查找效率较高,
而红黑树插入时又只进行三次旋转就可以到平衡状态,
所以这里选用红黑树的结构储存数据。

2、参数

容量:数组的大小
负载因子:数组的每个组里面平均允许存多少的数据
扩容阈值:Map最多允许存的数据量。

容量和负载因子都是创建HashMap时允许自定义的值,
那数组的大小*每个组允许存的就是扩容阈值了,
超过阈值之后,负载因子是死的,但是容量可以进行扩展,
容量每次会扩展为当前的2倍大小。

3、扩展

HashMap在多线程下不是线程安全的,
那么要想在多线程下使用map结构,
就应该选择HashTable或ConcurrentHashMap

HashTable非常好理解
HashTable就是为了HashMap能在多线程下使用,
在HashMap的所有方法前加了synchronize关键字来保障线程安全

concurrentHashMap:
concurrentHashMap的数据结构仍然是数组+链表+红黑树,
但是加入了分段锁segment以及CAS操作来改善线程安全问题

PS:我尽快更新关于锁的八股文内容


总结

码字,码字,码字,只有码字可以让我安心,只有码字可以使我快乐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破晓星芒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值