HashMap

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、Hash算法流程

key-values =》根据key计算Hash值=》根据hash值求数组下标


二、Hash计算

Hash值 = 》为了 定位数组下标
计算方式(异或):hash &(n-1)(n代表数组长度)(2的整数次方)
总结:Hash算法: 数据定位=》避免 Hash冲突

1. 问:为什么使用异或运算??

保证得到的Hash值足够随机


2. 问:数组的初始容量,为什么必须是2的整数次方???

1.效率(数组下标计算效率)
当数组超过17,必然发生Hash冲突,为了少发生冲突
解决方式:扩容=》扩容因子(加载因子)0.75(元素的填充比例)


3. 问:为什么加载因子(扩容因子)是0.75???

空间利用率高,降低查询成本


4. 问:HashMap树化的参数是8???

因为链表长度大于8的时候,查询效率会比较那慢,且性能很低==》树化 =》查询快,成本低


5. 问:链表的长度达到8,一定会树化吗?

不会,需要数组扩容长度达到64,链表长度达到8,才会树化


6. 问:如果链表的长度达到8,数组是64怎么办???

数组进行通过扩容因子,进行合理扩容


7. 问:当多个线程,引发高并发问题(多线程死锁问题)怎么办??

JDK1.7经常死锁:由于数据都是头插的
JDK1.8很少死锁:数据都是尾插的
使用ConcurrentHashMap=>只锁一个节点,其他节点还可以继续操作(保证效率)


8. 什么是写时复制容器??

写时复制容器=》CopyOnwriteArragList
在并发时=》读的多,写的少=》在写的时候copy复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值