1.7-hashtable = 数组 + 链表
(>=) 1.8 = 数组 + 链表 + 红黑树
HashMap 的容量 -》 数组的大小
new HashMap(): 如果不写构造参数,默认大小是16,
如果说写了初始容量:11,hashmap的初始容量就是11?
Hash冲突解决方式:
1.7 头插法
HashMap并不是用取模计算index,而是用位运算!
效率:位运算 > %
并没有说HashMap的容量一定是16,
/** The default initial capacity - MUST be a power of two. */ 必须是2的指数幂?
roundUpToPowerOf2(size); // 强行将非2的指数次幂的数值转化成2的指数次幂
怎么转化?
1. 必须最接近size,11
2. 必须大于等于size
3. 必须是2的指数次幂
为什么一定要转成2的指数次幂?
计算索引:int i = indexOf(hash, table.length);
static int indexFor(int h, int length) {
return h & (table.lenght - 1);
}
HashMap扩容
当前HashMap存了多少Element,size >= threshold,threshold为扩容阈值
threshold扩容阈值 = capacity * 加载因子。
扩容怎么扩?
扩容为原来的2倍,
转移数据,
重要成员变量
DEFAULT_INITIAL_CAPACITY = 1<<4; Hash表默认初始容量
MAXIMUM_CAPACITY= 1<<30; 最大Hash表容量
DEFAULT_LOAD_FACTOR=0.75f; 默认加载因子
TREEIFY_THRESHOLD=8; 链表转红黑树阈值
UNTREEIFY_THRESHOLD=6; 红黑树转链表阈值
MIN_TREEIFY_CAPACITY=64; 链表转红黑树时hash表最小容量阈值,达不到优先扩容。
End!
标签:扩容,Map,Set,HashMap,阈值,int,List,链表,size From: https://www.cnblogs.com/zhf123/p/16868071.html