java8 hashmap扩容机制
默认情况下HashMap的容量是16,如果用户通过构造函数指定了一个数字作为容量,那么Hash会选择大于该数字的第一个2的幂作为容量。(3->4、7->8、9->16)
如果map在put的时候发现超过阙值的时候就会产生扩容:
阙值 = 负载因子 * 容量
threshold = loadFactor * capacity
所以我们知道map里存放的个数时候,new的构造函数的设置值应该利用公式 = (需要存储的个数 / 负载因子)+ 1
比如map里要存放16个元素
(16 / 0.75) + 1 = 22
Map<String, String> map = new HashMap<String, String>(22); // 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; map容量变成32 阙值 = 32 * 0.75 = 24 此时我们存放16个元素就不会触发扩容
不积跬步,无以至千里;不积小流,无以成江海