Java8 HashMap源码 解读tableSizeFor方法

源码:

    /**
     * Returns a power of two size for the given target capacity.
     */
	static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

注意: HashMap要求容量必须是2的幂,因为不为2的幂保证不了均匀的分布


  • 参数 cap :是指HashMap的容量大小
  • int n = cap - 1 :是为了防止cap已经是2的幂时
  • |= :“|” 是按位或运算符,举例:i |= j 相同于 i = i|j
  • >>> :无符号右移
  • MAXIMUM_CAPACITY HashMap的最大容量,MAXIMUM_CAPACITY = 1 << 30

cap = 18;
第一次右移:n |= n >>> 1;

n = 17;转换二进制 n = 10001;
n >>> 1 无符号右移1位 等于 01000;
最后 或运算 10001 | 01000 = 11001;

第二次右移:n |= n >>> 2;

n = 25;转换二进制 n = 11001; (注意 n 的值变化)
n >>> 2 无符号右移2位 等于 00110;
最后 或运算 11001 | 00110 = 11111;


第五次右移 :n |= n >>> 16;

n = 31;转换二进制 n = 11111;
n >>> 16 无符号右移16位 等于 00000;
最后 或运算 11111 | 00000 = 11111;

根据图中运算可以得到结论,每一步的目的是将10情况变成11

最后 return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1

判断 n 的值是否小于 0;
true 则返回 1;
false 继续校验 n 的大小 是否大于等于 HashMap的最大容量 true 返回 MAXIMUM_CAPACITY ,false 返回 n + 1
注:n + 1 是HashMap容量必须是2的幂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值