HashMap有两个很重要的参数,一个是capacity 也就是数组的容量,或者说是桶的个数,还有一个是size就是元素的个数
在Map map = new HashMap();的时候桶的个数为16个,当执行put的时候首先要进行一个叫hash的过程就是通过算法计算出要储存在哪个桶中
我们知道hash方法的功能是根据key来定位键值对储存的位置也就是说输入的key值是一个object类型,但是我们需要的是一个int类型的来进行数组的定位,所以就有了一个方法进行对其进行转换,所以就有Object方法中的hashCode方法,这个方法会返回一个int我们直接对这个int进行取模但是在java7之后这个运算就变成位运算了,大大增加了效率。
扩容
除了上述的初始化的时候会指定HashMap的容量,在扩容的其容量也可能改变。
HashMap有扩容机制,就是当达到扩容条件的时候就会进行扩容,HashMap的扩容条件就是当HashMap中的size(元素个数)超过临界值(threshold)时就会自动扩容
在HashMap中:threshold = loadFactor(装载因子) * capacity(桶数)
loadFactor 装载因子就是表示HashMap满的程度,默认值为0,75F 设置为0.75有个好处就是它正好是3/4而桶数又是2的幂鼠疫两个数的乘积都是整数。
对于一个默认的HashMap来说它触发扩容的是16*0.75 = 12 的时候触发扩容,而扩容的数量就是为原来的2倍
可以引入依赖进行扩容
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>17.0</version>
</dependency>
Maps.newHashMapWithExpectedSize(7)