HashMap 的长度为什么是 2 的幂次方?

HashMap 的长度为什么是 2 的幂次方?

为了能让HashMap存取高效,尽量减少碰撞,需要将散列表的数据分配均匀。使用HashMap查询或插入数据时,需要先对数组长度取模运算,index = hash%length,得到余数用来存放位置,也就是对应的数组角标。取余操作中,如果除数是2的幂次,则等价于其除数减一的与操作,即hash%length=hash&(length-1),这里采用&运算比%运算效率高,故HashMap的长度需是2的幂次方。

HashMap数据结构总结:

  1. HashMap内部的bucket数组长度为什么一直都是2的整数次幂答:这样做有两个好处,第一,可以通过(table.length - 1) & key.hash()这样的位运算快速寻址,第二,在HashMap扩容的时候可以保证同一个桶中的元素均匀地散列到新的桶中,具体一点就是同一个桶中的元素在扩容后一半留在原先的桶中,一半放到了新的桶中。
  2. HashMap默认的bucket数组是多大答:默认是16,即时指定的大小不是2的整数次幂,HashMap也会找到一个最近的2的整数次幂来初始化桶数组。
  3. HashMap什么时候开辟bucket数组占用内存答:在第一次put的时候调用resize方法
  4. HashMap何时扩容?答:当HashMap中的元素数量超过阈值时,阈值计算方式是capacity * loadFactor,在HashMap中loadFactor是0.75
  5. 桶中的元素链表何时转换为红黑树,什么时候转回链表,为什么要这么设计?答:当同一个桶中的元素数量大于等于8的时候元素中的链表转换为红黑树,反之,当桶中的元素数量小于等于6的时候又会转为链表,这样做的原因是避免红黑树和链表之间频繁转换,引起性能损耗
  6. Java 8中为什么要引进红黑树,是为了解决什么场景的问题?答:引入红黑树是为了避免hash性能急剧下降,引起HashMap的读写性能急剧下降的场景,正常情况下,一般是不会用到红黑树的,在一些极端场景下,假如客户端实现了一个性能拙劣的hashCode方法,可以保证HashMap的读写复杂度不会低于O(lgN)public int hashCode() {
    return 1;
    }
  7. HashMap如何处理key为null的键值对?答:放置在桶数组中下标为0的桶中
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值