Hashmap
感谢黑马
快速查找
hashmap如何进行快速查找:将原始值按照一定的规律进行编码,从而获得该Key所在得位置(数组得索引值)。在进行查找得时候,将上述过程反着进行就可以快速查找了。
过程:
- 通过计算原始hash 二次hash 以及桶下标,获得当前Key值所对应的数组的索引,以便后续快速查找。
- 但是,有些Key值会拥有相同得桶下标。因此,将具有相同桶下标得Key值通过链表得方式存在该索引下.
- 当链表长度过长时,hashmap得查询性能会下降。如何优化查询性能?
1)缩小链表长度–>扩容。
如何扩容
首先,数组得索引值通过下式取得
Index =hash2(hash1(key))%capacity
Index =hash2(hash1(key))&(capacity-1)
可以看出,数组的容量可以改变key值的索引,因此,扩容是一个解决办法。
**什么时候扩容** hashmap中得factor就是一个判断是否扩容得参数(默认0.75)。
if(元素个数>factor*capacity)
capacity = 2*capacity;
但是当key值的原始hash值都一样时,扩容之后也不会改变链表长度。
2)将链表转换为红黑树–>树化(空间换时间)
红黑树的特性
父节点左侧比他小,右侧比他大。
红黑树Vs链表
红黑树的搜索时间复杂度o(log2(n))
链表的搜索时间复杂度o(n)
红黑树的底层数据结构是treenode
链表的底层数据结构是Node
红黑树的空间复杂度大于链表的空间复杂度
树化的条件
链表长度大于8,且数组容量大于等于64