hashMap默认起始容量是16 为什么。
展开全部
为后来者解惑!
先抛出俩个问题:
1.为什么hashmap的容量约定是the power of 2 size呢
2.基于问题1的前提下,为什么不是32,或者8呢
回答:hashmap是基于数组的,源码: transient Node<K,V>[] table;
table俗称hash桶(hash bin),将一个元素放到桶里时,不是像arraylist那样按顺序放,而是根据key的hash值来计算index。
这个时候就会产生hash碰撞,即如果算法不合法,key会大概率的计算到同一个index,从而使元素都放在同一个桶中。
为了减少哈希碰撞的几率,我们需要一个算法,该算法能让元素比较平衡的放到不同的桶中,最简单的方式就是key.hash % table.length,为了效率,使用了位与&运算符。源码中使用了tab[i = (n - 1) & hash]。
当n=the power of 2时,n-1的二进制的后几位全是1,这时上文提到的【&】操作更均匀。
问题2,为什么是16呢,源码中是这么写的,Maybe a tradeoff between speed, utility, and quality of bit-spreading.就是考虑到速度,实用性和位拓展质量后的一个【最佳实践】。仅仅是一个最佳实践。可以根据自己的实际业务场景来设置不同的值,比如4,8等
先抛出俩个问题:
1.为什么hashmap的容量约定是the power of 2 size呢
2.基于问题1的前提下,为什么不是32,或者8呢
回答:hashmap是基于数组的,源码: transient Node<K,V>[] table;
table俗称hash桶(hash bin),将一个元素放到桶里时,不是像arraylist那样按顺序放,而是根据key的hash值来计算index。
这个时候就会产生hash碰撞,即如果算法不合法,key会大概率的计算到同一个index,从而使元素都放在同一个桶中。
为了减少哈希碰撞的几率,我们需要一个算法,该算法能让元素比较平衡的放到不同的桶中,最简单的方式就是key.hash % table.length,为了效率,使用了位与&运算符。源码中使用了tab[i = (n - 1) & hash]。
当n=the power of 2时,n-1的二进制的后几位全是1,这时上文提到的【&】操作更均匀。
问题2,为什么是16呢,源码中是这么写的,Maybe a tradeoff between speed, utility, and quality of bit-spreading.就是考虑到速度,实用性和位拓展质量后的一个【最佳实践】。仅仅是一个最佳实践。可以根据自己的实际业务场景来设置不同的值,比如4,8等
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询