从上图容易看出,如果选择合适的哈希函数,put()和get()方法可以常数时间内完成。但是在对HashMap进行迭代时,需要遍历整个table以及后面跟着的冲突链表。因此对于迭代比较多的场景,不宜将HashMap的初始大小设置过大。
有两个参数可以影响HashMap的性能:初始容量(inital capacity)和负载系数(load factor)。初始容量指定可初始table的大小,负载系数用来指定自动扩容的临界值。当entry的数量超过capacityloadload_factor时,容量将自动扩容并重新哈希。对于插入元素较多的场景,将初始容量设置大可以减少重新哈希的次数。
首先进行哈希值的扰动,获取一个新的哈希值。(key==null)? 0 : (h =key.hashCode())^(h>>>16)
判断table是否为空或者长度为0,如果是则进行扩容操作
if((tab=table)==null||(n=tab.length()==0){
n=(tab=resize()).length;
}
根据哈希值计算下标,如果对应小标正好没存数据,则直接插入即可,否者需要覆盖
判断tab[i]是否为树节点,否则向链表插入数据,是则向树中插入节点
如果链表中插入节点的时候,链表长度大于等于8,则需要把链表转换为红黑树
最后所有元素处理完成后,判断是否超过阈值;threshold,超过则扩容