Hashmap组成
Hashmap大概由两部分组成,第一部分是:数组;第二部分是:链表或者红黑树(在jdk1.8以后当一支链表的长度超过8以后,链表要转化为红黑树),emmm大概长成这样子:
如何构建一个Hashmap?
- 构建一个Hashmap我们得先确定一个散列函数(下图菱形中的X%6就是一个简单地散列函数[自己定义不唯一])
- 然后让数据根据散列函数运算得到对应的散列值,找到它在数组中对应的位置
- 将数据放入数组对应的链表/红黑树中(放在红黑树的头部比较方便)
- 散列碰撞:如下图圈出来的情况—>不同的值经过散列函数后进入了同一个链表中的现象
- 重(chong)Hash:我们确定每个链表/红黑树中的数据量是相同的(比如30个),当一棵树中的数据超过30时,将数组的size翻倍,然后打乱所有的数据,重新根据散列函数分配数据
- 数据倾斜:当散列过程中,大量的数据都被配往一棵后者几棵树中,这种数据分配不平衡的现象较数据倾斜(所以散列函数要搞的复杂一点,尽量能使数据发散的分配到所有的树中)
时间复杂度
因为数组的长度和链表的长度是一个常数,在插入/查找数据时所进行的步骤都为小于这个最大的常数,所以Hashmap的查找和插入的是将复杂度都为O(1)
来源:CSDN
作者:请叫我LR
链接:https://blog.csdn.net/gangsiqiu1848/article/details/104108690