1、
容量:数组大小,也叫哈希表大小(默认1>>4=16)
加载因子:元素装多满(默认0.75)
阈值:容量*加载因子
扩容条件:元素个数>阈值,且新元素key发生hash冲突。
2、
发生hash冲突,即两个元素计算后的hash值相等:
1.7:hash = key.hashcode(),hash9次扰动处理,再&(length-1)
1.8:hash = key.hashcode(),hash2次扰动处理,再&(length-1)
1.7 先扩容,再添加新元素(扩容时,不计算新元素,扩容后,再计算)
扩容后位置:hash = key.hashcode(),hash9次扰动处理,再&(length-1)计算复杂!!!
1.8 先添加,再扩容(扩容时,计算新元素)
3、
1.7:新元素使用头插法,并发扩容导致死循环。
解决:使用ConcurrentHashMap替代,hashtable性能低
1.8:新元素使用尾插法,插入后,判断链表长度>8,则变为红黑树,同时判断是否需要扩容。
4、
并发插入数据,出现数据覆盖。
解决:使用ConcurrentHashMap替代,hashtable性能低
5、
插入顺序与查询顺序不一致。
解决:使用linkedHashMap替代