【基础篇】HashMap中capacity 的探究

相信很多猿人工作都使用hashmap ,但是真正对他了解的有多少呢?今天我们就来看下我们在new hashmap 的时候,它的大小是怎么变化的。

先看下这段代码:

public static void main(String[] args) throws Exception{
        Map<String,String> map = new HashMap<>(3);

        Class<? extends Map> aClass = map.getClass();
        Method capacity = aClass.getDeclaredMethod("capacity");
        capacity.setAccessible(true);
        System.out.println("capacity="+capacity.invoke(map));

    }

这里我先设置hashmap 的 initialCapacity为3 。暂且不考虑设置的对不对。

猜测下执行这个方法 capacity 输出会是多少?

 思考完了,我们就来看下结果。

capacity=4。

为什么是4呢?

通过源码我们发现,它的底层调用的是这个方法

 this 指向的是下面这个构造方法

这个方法里做了一些初始大小的校验。调用了tableSizeFor 进行计算。

上面这个方法才是真正计算大小的。我们来验证下。

 经过上面的流程,我们发现它会对我们传入的值进行位运算操作,最后进行比较,将最后的值+1 返回。

(无符号右移“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。

如果我们创建一个initialCapacity是9 的map ,它的capacity又是多少呢?

Map<String,String> map = new HashMap<>(9);

欢迎大家留言讨论。。。。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值