HashMap
散列表也叫哈希表,是存储Key-Value映射的集合。对于某一个Key,散列表可以在接近O(1)的时间内进行读写操作
寻址方式
对key按一定的计算规则,算出hash值,并对数组长度进行取模
index = HashCode (Key) % Array.length
哈希冲突
当插入的Entry越来越多时,不同的Key通过哈希函数获得的下标有可能是相同的。例如002936这个Key对应的数组下标是2;002947这个Key对应的数组下标也是2。
解决哈希冲突
- 开放寻址法(ThreadLocal)
- —链表法(HashMap)
扩容
衡量HashMap需要进行扩容的条件如下【HashMap.Size >= Capacity×LoadFactor】当前长度:Capacity,负载因子:LoadFactor(0.75f)
数据结构
ArrayList数据结构:【数组】
LinkedList数据结构:【链表】,单向和双向 Node(element,next,prev)
HashMap数据结构:【数组+链表】;链表长度超过8(hash冲突次数),则将其转换为红黑树
HashMap数组的每一个元素不仅是一个Entry对象,还是一个链表的头节点。每一个Entry对象通过next指针指向它的下一个Entry节点。当新来的Entry映射到与之冲突的数组位置时,只需要插入到对应的链表中即可
|