hashmap总结

1.说说你对hash算法的理解
追问:hash算法任意长度的输入 转化为了 固定长度的输出,会不会有问题呢?
追问:hash冲突能避免么?

hash基本概念就是把任意长度的输入通过hash算法后转化为固定长度的输出;
问题是不同的值经过hash算法后会计算出相同的hash值,发生hash冲突;
hash算法没办法避免,只能尽量避免
2.你认为好的hash算法,应该考虑点有哪些呢?
算法效率高,长文本可以高效计算出hash值
hash值不能逆推出原值
分散,尽量降低hash冲突
3.HashMap中存储数据的结构是什么样的呢?
jdk8 数组加链表加红黑树
每个数据单元都是个NODE结构,NODE中有key,value,next,hash
next字段就是发生hash冲突的时候,当前桶位中的node与冲突node连成一个链表要用的字段
4.创建HashMap时,不指定散列表数组长度,初始长度是多少呢?
追问:散列表是new HashMap() 时创建的么?
初始长度16,
懒加载机制,第一次put数据时创建
5.默认负载因子是多少呢,并且这个负载因子有什么作用?
0.75,计算扩容阈值用的 16*0.75=12
6.链表转化为红黑树,需要达到什么条件呢?
链表长度达到8
当前散列表的数组长度已经达到64,否则的话就算链表长度达到了8,他也不会转化为树,仅仅发生一次resize,散列表扩容
7.Node对象内部的hash字段,这个hash值是key对象的hashcode()返回值么?
追问:这个hash值是怎么得到呢?
追问:hash字段为什么采用高低位异或?
不是简单的hashcode
key的hashcode高16位异或低16位、
因为hash寻址算法的缘故,散列表长度必须是2的次方数
寻址算法是 hash&(table.length-1)
table的length因为是2的次方数,所以转化为二进制后,高位1 其余全是0,减1之后高位全是0,低位全是1,任何数与这种数按位与之后得到的数值一定是大于等于0,小于等于这个长度,加上数组下标为0的slot,加起来正好是2的次方数
高低位异或是为了优化hash算法,因为hashmap内部散列表,大多数场景下,不会特别大,所以table.length-1得到的这个二进制数,实际位很有限,一般都在低16位以内,这样key的hash值得高16位就等于完全浪费了,没起到作用,所以采用这种方式
8.HashMap put 写数据的具体流程,尽可能的详细点!
寻址算法之后四种情况
slot等于null
直接占用slot,将key,value包装能node对象放到其中

slot不等于null,并且node还没有链化
先对比当前node的key,与当前put对象的key是否完全相等,如果完全相等,直接replace,如果不相等,就是hash冲突了,node后追加一个node,尾插法

node已经链化
看看链表里面有没有put进来的key,如果有的话,直接replace,否则的话,node追加到尾部,是否达到树化阈值,达到的话调用树化方法树化

链已经转化为红黑树了

9.红黑树的写入操作,是怎么找到父节点的,找父节点流程?

10.TreeNode数据结构,简单说下。
继承了NODE,加了字段,纸箱父节点的parent,指向左节点的left,指向右节点的right,还有个表示颜色的
插入操作
11.红黑树的原则有哪些呢?
根节点必须是黑色的
叶子节点到根节点的路径上,黑色节点一定是一致的 俗称黑高
不能两个红色节点相连,红色节点的子节点一定是黑色节点
叶子节点一定是黑色的

左旋和右旋是什么?

12.JDK8 hashmap为什么引入红黑树?解决什么问题?
追问:为什么hash冲突后性能变低了?【送分题】
解决hash冲突导致链化严重,严重影响get的查找效率,本身o1,链化严重滞后 on
链表的特性,导致查询慢
13.hashmap 什么情况下会触发扩容呢?
追问:触发扩容后,会扩容多大呢?算法是什么?
追问:为什么采用位移运算,不是直接*2?
记录当前数据量的字段,达到扩容阈值之后出发
扩容是按照上一次位移运算得到的,左移一位
cpu不支持乘法运算,效率低,位运算效率高
14.hashmap扩容后,老表的数据怎么迁移到扩容后的表的呢?
挨个桶位推进迁移,一个桶位一个桶位处理,看当前桶位的数据状态,四种情况
slot是null

node没有链化
直接迁移,根据新表的tablesize计算出在新表的位置,然后存过去
链化
当前slot中存放的链表拆成两个链表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值