相信很多猿人工作都使用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);
欢迎大家留言讨论。。。。