hashmap相关知识点

hashmap 在java1.7与1.8的区别

什么时候转变为红黑树

hashmap扩容机制(resize)

什么时候扩容,什么时候缩容?
结论 当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容

160.75=12的时候,就把数组的大小扩展为216=32
啥时候链表变为红黑树,啥时候红黑树升级为链表
链表长度超过8时转为红黑树
红黑树节点到6转为链表
扩容时 如何确保之前存储的值可以被正确找到?

当HashMap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,所以这是一个通用的操作,很多人对它的性能表示过怀疑,不过想想我们的“均摊”原理,就释然了,而在hashmap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。
 
  那么HashMap什么时候进行扩容呢?当hashmap中的元素个数超过数组大小loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,数组大小为16,那么当hashmap中元素个数超过160.75=12的时候,就把数组的大小扩展为216=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。比如说,我们有1000个元素new HashMap(1000), 但是理论上来讲new HashMap(1024)更合适,不过上面annegu已经说过,即使是1000,hashmap也自动会将其设置为1024。 但是new HashMap(1024)还不是更合适的,因为0.751000 < 1000, 也就是说为了让0.75 * size > 1000, 我们必须这样new HashMap(2048)才最合适,既考虑了&的问题,也避免了resize的问题。

散列函数==hash函数

HashMap默认加载因子(loadFactor)为什么选择0.75 和泊松分布有没有关系

结论:提高空间利用率和 减少查询成本的折中
负载因子太小了浪费空间并且会发生更多次数的resize,太大了哈希冲突增加会导致性能不好,所以0.75只是一个折中的选择
有图有真相
在这里插入图片描述

HashMap 初始容量是 capital=16,扩容方式为 capital=capital+capital>>1 ,约等于1.5倍
HashMap加载因子0.75和泊松分布没有关系
随机哈希的存放数据方式本身就是满足泊松分布的。java8及以上版本中开头这一段的注释,是为了解释在java8 HashMap中引入Tree Bin(也就是放数据的每个数组bin从链表node转换为red-black tree node)的原因:链表的消耗时间为O(n) ,rb-tree是O(logn)

散列冲突以及解决方案

  1. 开放地址法:思路:还在原有的数组中添加数据,向自身求空间
    a 向后寻址法(探测法) 如果发现指针位置满了,则找下一个空位置(删除时不直接删除,而是标记删除位,防止查找时由于删除导致空位,导致找不到添加的元素)
    b 二次探测法 若冲突,找当前位置的 后平方个位置入 当前位置4有数据了,则找 4^2位置的数据
    c 再哈希法 使用多个散列函数 一般三个散列函数可以避免冲突
  2. 链地址法(拉链法):思路:跳出原有数组,向外求空间
    拉链法的缺点:
    指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度
    hashmap采用的是链地址法 实现为:链表或红黑树

为啥用红黑树不用 平衡二叉树avl

查找性能相似在同一个数量级, 自平衡性能 没有avl那么严格
红黑树原则
红点原则
黑点原则

JDK8 HashMap底层数组长度,取值2次幂的原因

结论 性能好当 array.ength长度是2的次幂时,key.hashcode % array.length等于key.hashcode & (array.length - 1)

参考
HashMap默认加载因子为什么选择0.75?(阿里)
终于明白JDK8 HashMap底层数组长度,取值2次幂的原因

HashMap的扩容机制—resize()
泊松分布和指数分布:10分钟教程
HashMap defaultLoadFactor = 0.75和泊松分布没有关系

HashMap到8时转为红黑树到6转为链表 原因详解
阿里P7岗位面试,面试官问我:为什么HashMap底层树化标准的元素个数是8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值