HashMap底层数据结构
底层由数组+链表+红黑树组成
为什么使用数组+链表
使用链表+数组是为了更好的解决hash冲突的问题
数组:查找容易,通过index快速定位;插入和删除困难,需要移动插入和删除位置之后的节点
链表:查找困难,需要从头结点或尾节点开始遍历;插入和删除容易;
将链表和数组结合起来发挥两者的优势,使用一种叫拉链法的方式解决哈希冲突;
为什么要改成数组+链表+红黑树
当定位到索引位置后,需要遍历链表找到节点,如果链表很长的话,hash冲突很严重,会有查找性能的问题,所以引用红黑树来优化;
链表的查找性能是O(n),红黑树是O(log n)
什么时候使用链表,什么时候使用红黑树
对于插入,默认情况使用链表节点,当个同一个索引位置的节点新增超过8个:如果数组长度大于64,则转化为红黑树;
对于移除,阈值为6;
HashMap有哪些重要的属性,分别是做什么的
- 储存节点table数组
- size :HashMap已经存储的节点个数
- threshold :扩容阈值,初始化容量
- loadFactor:负载因子