HashMap底层是一个数组,结合链表和红黑树来解决冲突。
主要有这3点:
1)怎么存
存一个Key-Value 时,先算Key 的hashCode,然后用(table.length-1)& hash 算出应该放在数组的哪个下标位置。
2)冲突了怎么办
两个不同的Key算出来下标一样,就叫哈希冲突。HashMap的解决办法是用链表把它们串起来,JDK8做了优化,如果同一个下标下的链表超过8个节点(且数组长度大于等于64),就转成红黑树,查找速度从O(n)变成O(logn)。
3)扩容机制
数组长度是有限的,存多了会挤。HashMap有个负载因子默认0.75,数组用了75%就自动扩容,把数组大小翻倍,然后把所有数据重新算位置放到新数组里。这个操作叫rehash,比较耗性能,所以初始化时最好给个预估容量。